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

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

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

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

Ответы [ 3 ]

28 голосов
/ 02 февраля 2010

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

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

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

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

Таким образом, теперь различие должно быть ясным:

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

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

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

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

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


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

0 голосов
/ 15 февраля 2012

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

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

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