Как использовать события в Yii
Я хочу запустить некоторый код в событии onBeginRequest.
Где мне это сделать? Я предполагаю, что я не собираюсь добавлять это в код основной библиотеки.
Я совершенно нуб в Yii
2 ответа
Если вы хотите использовать onBeginRequest и onEndRequest, вы можете сделать это, добавив следующие строки в файл конфигурации:
return array (
...
'onBeginRequest'=>array('Y', 'getStats'),
'onEndRequest'=>array('Y', 'writeStats'),
...
)
или вы можете сделать это встроенным
Yii::app()->onBeginRequest= array('Y', 'getStats');
Yii::app()->onEndRequest= array('Y', 'writeStats');
где Y
это имя класса и getStats
а также writeStats
методы этого класса. Теперь представьте, что у вас есть класс Y
объявлено так:
class Y {
public function getStats ($event) {
// Here you put all needed code to start stats collection
}
public function writeStats ($event) {
// Here you put all needed code to save collected stats
}
}
Таким образом, при каждом запросе оба метода будут запускаться автоматически. Конечно, вы можете подумать "почему бы просто не перегружать метод onBeginRequest?" но прежде всего события позволяют вам не расширять класс для запуска некоторого повторяющегося кода, а также они позволяют выполнять разные методы разных классов, объявленных в разных местах. Так что вы можете добавить
Yii::app()->onEndRequest= array('YClass', 'someMethod');
в любой другой части вашего приложения вместе с предыдущими обработчиками событий, и вы получите запуск обоих Y->writeStats
а также YClass->someMethod
после обработки запроса. Это с помощью поведения позволяет создавать компоненты расширения практически любой сложности без изменения исходного кода и без расширения базовых классов Yii.
Я полагаю, что вы можете сделать это практически в любом месте ваших файлов до начала любого вывода, поэтому он должен работать в контроллере, представлении или пользовательском классе, обычно расположенном в "защищенной" папке в веб-приложении Yii. К вашему сведению, эти файлы не являются основными файлами и могут (почти) свободно редактироваться, в отличие от файлов инфраструктуры Yii (на которые ссылается переменная "$yii" в файле bootstrap index.php).
функции выглядят так:
Yii::app()->onbeginRequest = create_function('$event', 'return function_name_a();');
Yii::app()->onendRequest = create_function('$event', 'return function_name_b();');