Как создать нечто вроде Zend preDispatch в Symfony2
Я делаю проект с использованием Symfony 2, и мне нужно иметь такой метод, как preDispatch в Zend, который будет вызываться перед любым действием в контроллере. Я очень новичок в Symfony и немного занимаюсь серфингом в сети. Я обнаружил, что в старых версиях Symfony был метод preExecute, но теперь он исчез. Что я могу использовать для решения моей проблемы?
Спасибо заранее.
Ответы
Ответ 1
Метод Symfony 1 preExecute() сделал это очень просто, но, как вы сказали, он недоступен в Symfony2. К счастью, в Symfony2 у вас есть доступ к событиям. Структура рассылает многочисленные события во время жизненного цикла приложения. Здесь перечислены некоторые из отправленных событий - http://symfony.com/doc/2.0/book/internals.html#events.
Вы также можете использовать панель инструментов веб-отладки, чтобы посмотреть, какие события отправляются, и классы (EventListeners), которые прослушивают событие. Эта ссылка также подробно описывает всю систему событий, если вы ее не знакомы.
К сожалению, мне не приходилось сама имитировать функцию preExecute, поэтому я не знаю точно, какое событие вам нужно будет слушать, но я уверен, прочитав документы, вы точно поймете, что вам нужно.
Надеюсь, что это поможет.
Ответ 2
Как мне предложили @Arms, я начал изучать механизм событий Symfony 2. Теперь я собираюсь записать код, который решил мою проблему (все конфигурации, которые я выполняю в YAML, но вы можете сделать это также в XML или PHP).
Сначала вам нужно описать конфигурацию Symfony, какое событие вы хотите прослушать и что ядро должно вызывать при возникновении события. Для этого откройте файл конфигурации app\config\config.yml и добавьте следующий код:
services:
younamespace.yourbundle.listener.preexecute:
class: Location\Of\Your\Listener\Class
tags:
- { name: kernel.event_listener, event: kernel.controller, method: onKernelController }
Ваш класс должен реализовать метод onKernelController следующим образом:
public function onKernelController(FilterControllerEvent $event) {
if(HttpKernelInterface::MASTER_REQUEST === $event->getRequestType()) {
$controllers = $event->getController();
if(is_array($controllers)) {
$controller = $controllers[0];
if(is_object($controller) && method_exists($controller, 'preExecute')) {
$controller->preExecute();
}
}
}
}
После этого каждый раз, когда вы создаете метод preExecute в своем контроллере, он вызывается перед выполнением любых действий, поэтому вы можете делать много вещей в этом методе, например инициализацию переменных или некоторые проверки перед записью в БД и так далее на.
Вы также можете подробно ознакомиться с конфигурацией здесь (этот пример для события kernel.request, но это может помочь вам понять)
Удачи;)