Я хочу запустить код в событии onBeginRequest.
Где я могу это сделать? Я предполагаю, что я не должен добавлять это в код основной библиотеки.
Я абсолютно нуб в Yii
Если вы хотите использовать onBeginRequest и onEndRequest, вы можете сделать это, добавив следующие строки в ваш файл конфигурации:
return array ( ... 'onBeginRequest'=>array('Y', 'getStats'), 'onEndRequest'=>array('Y', 'writeStats'), ... )
или вы можете сделать это inline
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 } }
Поэтому при каждом запросе оба метода будут запускаться автоматически. Конечно, вы можете подумать: «Почему бы просто не перегрузить метод BeginRequest?» но, прежде всего, события позволяют не расширять класс для запуска повторного кода, а также позволяют выполнять различные методы разных классов, объявленных в разных местах. Таким образом, вы можете добавить
Yii::app()->onEndRequest= array('YClass', 'someMethod');
в любой другой части вашего приложения вместе с предыдущими обработчиками событий, и вы получите запуск Y->writeStats
и YClass->someMethod
после обработки запроса. Это с поведением позволяет создавать компоненты расширения практически любой сложности без изменения исходного кода и без расширения базовых классов Yii.
Я считаю, что вы можете сделать это в любом месте в своих файлах до того, как начнется какой-либо вывод, поэтому он должен работать в контроллере, представлении или пользовательском классе, обычно находящемся в «защищенной» папке в веб-приложении Yii. FYI, эти файлы не являются основными файлами и могут быть (почти) свободно отредактированы, как описано в файлах файлов Yii (на что ссылается «$ yii» var в файле bootstrap index.php).
функции выглядят так:
Yii::app()->onbeginRequest = create_function('$event', 'return function_name_a();'); Yii::app()->onendRequest = create_function('$event', 'return function_name_b();');