Zend Framework: Каковы различия между функциями init () и preDispatch () в объектах контроллера?

Я думаю, что порядок выполнения – init (), preDispatch (), а затем вызывается action ().

  1. Должен ли я инициализировать мои переменные, которые являются общими для всех действий, в init () или preDispatch ()? Я видел людей, использующих обе функции для инициализации. Вероятно, как следует из названия, это должно быть сделано в init (), но тогда какой материал пойдет в preDispatch ()?

  2. Что происходит между вызовами функции init () и preDispatch ()?

Первый preDispatch() вызывается для экземпляров Zend_Controller_Plugin_Abstract . Здесь у вас есть объекты запроса и ответа, поэтому вы можете отфильтровать запрос или выполнить некоторую подготовку с использованием информации из запроса.

init() Zend_Controller_Action вызывается следующим как часть конструктора. Это поможет вам инициализировать ваш контроллер, без необходимости переопределять и повторять подпись конструктора ( Zend_Controller_Action::__contruct() ).

Здесь preDispatch() метод preDispatch() контроллера. Вы можете вызвать $request->setDispatched(false) чтобы пропустить текущее действие – не уверен, что вы можете сделать это в init()

Затем вызывается метод действия (например, viewAction() ). Здесь вы делаете свою обычную работу, как выборка из модели и заполнение вида.

Поэтому различие должно быть ясным:

  • Если вы хотите, чтобы что-то было выполнено до всех действий – поместите его в плагин и используйте один из крючков (помимо preDispatch() есть routeStartup и другие ),
  • если вы хотите перед каждым действием в контроллере – init или preDispatch() ,
  • если только для одного действия – самого действия.

Что происходит между preDispatch() функции init() и preDispatch() ?

Почти ничего – preDispatch() , и если вы не вызывали $request->setDispatched(false) , действие выполняется.

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

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


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

init() : загружен перед функциями, поэтому, если вы хотите загрузить его перед всеми функциями проекта, поместите его в bootstrap Class. Если перед указанными функциями класса, поместите его в init() эту функцию класса.

preDispatch() : загружается перед передним контроллером.