Как создать нечто вроде 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, но это может помочь вам понять)

Удачи;)