Глобальные удобные методы
Ну, вы действительно не можете сделать исправление обезьян в PHP (как минимум 5.2), и это, вероятно, хорошая вещь дляразработчики, которые должны поддерживать ваш код после вашего ухода.:)
CakePHP - будучи платформой MVC со строгими соглашениями - затрудняет вам нарушение парадигмы MVC, позволяя только расширять части, которые вам нужны в изоляции (то есть. AppModel
, AppController
и т. д.) и сохранение объектно-ориентированного основания в ядре нетронутым (что затрудняет добавление кода, который «может использоваться везде» для возможного неправильного использования).
Что касается добавления функциональности, которая выходит за пределы разделения MVCместо для этого app/config/bootstrap.php
.Когда вы размещаете код здесь, становится ясно, что он не является частью фреймворка (вполне справедливо), но позволяет вам добавлять подобные вещи до того, как CakePHP даже загрузится.Вот несколько вариантов действий:
- Создание функции (например, некоторые пользовательские функции, такие как
error()
, которые вызывают CakeLog::write()
так, как вам нравится). - Загрузите класс (например, загрузите свой собственный класс журналирования, называемый что-то вроде ..
Log
, чтобы вы могли вызывать Log::error()
местами) - См. Ниже:
API логгера
Cake позволяет выполнять множество настроек для таких вещей, как логгер, но, к сожалению, API, представленный нам, уже определен в ядре в этом случае.API для входа в CakePHP выглядит следующим образом, и вы можете использовать любой подход где угодно (ну, первый только в классах):
$this->log($msg, $level) // any class extending `Object` inherits this
// or
CakeLog::write($level, $message); // this is actually what is called by the above
Произвольный параметр $level
, который вы пытаетесь исключитьна самом деле довольно мощная функция :
$this->log('Cannot connect to SMTP server', 'email'); // logs to app/logs/email.log
// vs
$this->email('Cannot connect to SMTP server'); // ambiguous - does this send emails?
Мы только что создали совершенно новый тип журналов без написания дополнительной строки кода, и совершенно ясно, какова цель нашего кода.
Настройка регистратора
Разработчики ядра имели возможность добавить условие , позволяющее нам полностью заменить класс регистратора, если мы захотим:
function log($msg, $type = LOG_ERROR) {
if (!class_exists('CakeLog')) { // winning
require LIBS . 'cake_log.php';
}
// ...
Как видите, базовый класс CakeLog
создается только в том случае, если такого класса не существует, что дает вам возможность вставить что-то собственного создания (или точную копию с несколькими изменениями - хотявы хотели бы синхронизировать изменения с ядром - вручную - при обновлении):
// app/config/bootstrap.php
App::import('Lib', 'CakeLog'); // copy cake/libs/cake_log.php to app/lib/cake_log.php
Вышеприведенное даст вам полный контроль над реализацией CakeLog
class в вашем приложении, так что вы можете сделать что-то вроде динамического добавления имени вызывающего класса в ваши сообщения журнала.Однако более прямой способ сделать это (и другие типы ведения журнала - например, в базе данных) - это создать собственный поток журнала :
CakeLog::config('file', array(
'engine' => 'FileLog', // copy cake/libs/log/file_log.php to app/libs/log/file_log.php
));
TL; DR - Несмотря на то, что вы можете загрузить свой собственный код до начальной загрузки CakePHP или для использования отдельно в каждом из предоставленных слоев MVC, вы не должны вмешиваться в иерархию объектов, предоставляемую ядром.Это затрудняет добавление методов класса, которые наследуются глобально.
Мой совет: используйте предоставленный вам API и сконцентрируйтесь на добавлении дополнительных функций вместо синтаксических тонкостей.:)