Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

Первый 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), действие выполняется.

Ответ 2

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

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


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

Ответ 3

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

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