Я думаю, что порядок выполнения – init (), preDispatch (), а затем вызывается action ().
Должен ли я инициализировать мои переменные, которые являются общими для всех действий, в init () или preDispatch ()? Я видел людей, использующих обе функции для инициализации. Вероятно, как следует из названия, это должно быть сделано в init (), но тогда какой материал пойдет в preDispatch ()?
Что происходит между вызовами функции 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()
: загружается перед передним контроллером.