Я делаю проект с использованием Symfony 2, и мне нужно иметь такой метод, как preDispatch в Zend, который вызывается перед любым действием в контроллере. Я очень новичок в Symfony и немного занимаюсь серфингом в сети. Я обнаружил, что в старых версиях Symfony был метод preExecute, но теперь он исчез. Что я могу использовать для решения моей проблемы?
Заранее спасибо.
Метод preExecute () Symfony 1 сделал это очень просто, но, как вы сказали, он недоступен в Symfony2. К счастью, в Symfony2 у вас есть доступ к событиям. Структура рассылает многочисленные события во время жизненного цикла вашего приложения. Вот список некоторых отправленных событий – http://symfony.com/doc/2.0/book/internals.html#events .
Вы также можете использовать панель инструментов веб-отладки, чтобы посмотреть, какие события отправляются, и классы (EventListeners), которые прослушивают событие. Эта ссылка также подробно описывает всю систему событий, если вы ее не знакомы.
К сожалению, мне не пришлось самостоятельно имитировать функции preExecute, поэтому я не знаю точно, какое событие вам нужно будет слушать, но я уверен, прочитав документы, вы точно поймете, что вам нужно.
Надеюсь это поможет.
Как предложил @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, но это может помочь вам понять)
Повеселись 😉