Метод предварительной отправки Zend-контроллера - PullRequest
4 голосов
/ 17 февраля 2012

Я читал это , чтобы понять жизненный цикл запроса MVC Zend. Но я не могу вспомнить ни одного случая в Zend, где бы я использовал метод predispatch контроллера, разве метода init недостаточно для кода, который я хочу выполнить перед действиями контроллера.

Что именно должно быть в предзапуске контроллера, а не в init.

Можете привести пример?

Ответы [ 3 ]

10 голосов
/ 17 февраля 2012

См. Zend_Controller_Action - Инициализация объекта и следующий раздел Крюки до и после отправки .Они оба подробно разбираются в обоих, а также в самом Action Controller.

init() больше для настройки объекта контроллера и выполнения инициализации, которая будет доступна для всех ваших действий.Поскольку init() выполняется до preDispatch(), все, что вы настроите в init(), будет доступно для использования preDispatch().Несмотря на то, что можно пересылать или перенаправлять с init(), рекомендуется делать это с preDispatch(), поскольку он запускается до отправки действия контроллера.

Из руководства:

Примечание: использование init () и preDispatch () В чем разница между ними (init и preDispatch) и какими действиями вы будете заниматься в каждом?

The *Метод 1023 * init () в первую очередь предназначен для расширения конструктора.Как правило, ваш конструктор должен просто устанавливать состояние объекта и не выполнять много логики.Это может включать инициализацию ресурсов, используемых в контроллере (таких как модели, объекты конфигурации и т. Д.), Или назначение значений, полученных из фронт-контроллера, начальной загрузки или реестра.

preDispatch () *Метод 1028 * также можно использовать для установки состояния объекта или среды (например, представления, помощника действия и т. Д.), Но его основная цель заключается в принятии решения о том, следует ли отправлять запрошенное действие.Если нет, то вы должны _forward () выполнить другое действие или вызвать исключение.

Примечание: _forward () фактически не будетработать правильно при выполнении из init () , что является формализацией намерений двух методов.

2 голосов
/ 17 февраля 2012

, чтобы расширить ответ drew010, вот пример того, как я использую preDispatch () и int ():

public function preDispatch() {

        $this->_helper->layout->setLayout('admin');
    }

    /**
     *initiaize the flashmessenger and assign the _session property
     */
    public function init() {

        if ($this->_helper->FlashMessenger->hasMessages()) {
            $this->view->messages = $this->_helper->FlashMessenger->getMessages();
        }
        //set the session namespace to property for easier access
        $this->_session  = new Zend_Session_Namespace('location');

    }

Я использую preDispatch (), чтобы установить макет для каждого действия, так как это не макет по умолчаниюи в init () я инициализирую свой flash messenger и настраиваю пространство имен сеанса для этого контроллера и инициализирую сеанс как свойство.

1 голос
/ 24 сентября 2013

Вот одна популярная ошибка, где вы можете тратить кучу ресурсов, используя init () вместо preDispatch (): если вы осуществляете управление доступом с помощью метода preDispatch () плагина контроллера, последовательность вызовов будет такой: YourController :: init (), YourAccessPlugin :: preDispatch (), YourController :: preDispatch (), YourController :: whatAction. Это означает, что если вы выполняете какие-либо тяжелые действия в init (), то неавторизованные пользователи могут запустить его . Скажем, например вы запускаете новое пространство имен сеансов в init (), тогда бессмысленные поисковые роботы могут привести к тому, что ваша база данных сеансов будет завалена пустыми сеансами. Поэтому придерживайтесь очень простых простых вещей в init, избегайте касания или изменения каких-либо ресурсов, избегайте доступа к базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...