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