Я думаю, что порядок выполнения – 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() : загружается перед передним контроллером.