Как создать что-то вроде метода Zend preDispatch в Symfony2 - PullRequest
14 голосов
/ 03 сентября 2011

Я делаю проект с использованием Symfony 2, и мне нужно иметь такой метод, как preDispatch в Zend, который будет вызываться перед любым действием в контроллере.Я очень новичок в Symfony и немного разбираюсь в сети. Я обнаружил, что в старых версиях Symfony был метод preExecute, но теперь его нет.Что я могу использовать для решения моей проблемы?

Заранее спасибо.

Ответы [ 2 ]

18 голосов
/ 05 сентября 2011

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

Веселись;)

10 голосов
/ 03 сентября 2011

Метод preExecute () в Symfony 1 сделал это очень простым, но, как вы сказали, он не доступен в Symfony2. К счастью, в Symfony2 у вас есть доступ к событиям. Фреймворк отправляет многочисленные события в течение жизненного цикла вашего приложения. Вот список некоторых отправленных событий - http://symfony.com/doc/2.0/book/internals.html#events.

Вы также можете использовать веб-панель инструментов отладки, чтобы увидеть, какие события отправляются, и классы (EventListeners), которые прослушивают событие. Эта ссылка выше также подробно описывает всю систему событий, если вы с ней не знакомы.

К сожалению, мне не пришлось имитировать функцию preExecute самостоятельно, поэтому я не знаю точно, какое событие вам нужно прослушать, но я уверен, что, прочитав документы, вы точно поймете, что вам нужно.

Надеюсь, это поможет.

...