Сценарий ~/.bash_profile
выполняется на входе в систему.
_forward - это внутреннее перенаправление. В то время как _redirect отправляет заголовок, который сообщает браузеру клиента перейти к другому URL-адресу, _forward сообщает диспетчеру о необходимости внутреннего перенаправления запроса в другое место.
Если вы считаете нормальный порядок отправки:
preDispatch()
someAction()
postDispatch()
Вызов _forward в любой момент в этом случае следующие шаги не будут выполнены. Поэтому, если вы вызываете _forward в preDispatch (), someAction () не будет вызываться и так далее. Если вы используете _forward () в someAction () и используете помощник действий viewRenderer для рендеринга ваших представлений (вы позволяете фреймворку выбирать, какой сценарий представления визуализировать), то в someAction () не будет отображаться сценарий представления.
Когда запрос пересылается новому контроллеру / модулю, весь процесс отправки будет повторяться там.
Вы можете узнать, какое действие отправляется, используя:
$action = $this->getRequest()->getParam('action');
$ action будет формой URL для action, поэтому, если у метода есть имя someKindOfAction, $ action будет содержать some-kind-of. То же самое можно сделать и для контроллеров и модулей.
Мой опыт работы с Zend ограничен, и я надеюсь, что я не покажу вам то, что вы уже видели, а в соответствии с документами (12.7.6. Служебные методы) :
_forward ($ action, $ controller = null, $ module = null, array $ params = null): выполнить другое действие. Если вызывается в preDispatch (), текущее запрошенное действие будет пропущено в пользу нового. В противном случае, после обработки текущего действия, будет выполнено действие, запрошенное в _forward ().
Таким образом, это звучит как контекст того, когда оно вызывается. В последнем случае он сначала выполнит действие, из которого он был вызван , а затем выполнит перенаправленное действие. Исключение составляют случаи, когда он вызывается из обработчика preDispatch
Часть документации Framework, которая, клянусь, раньше там была, объясняла рабочий процесс отправки на общем уровне. Есть эта диаграмма , но ее ужасно сложно объяснить, что делает _forward.
Когда в действии _forward установит $ request-> isDispatched = false
, и настроит запрос на вызов контроллера / действия, указанного в _forward. Во время postDispatch проверяется isDispatched - если оно ложно, все снова запускается с использованием нового запроса.
Итак ... Если в вашем действии вы вручную визуализируете представления, они все равно будут отображаться. Все в действии по-прежнему будет происходить, просто другое действие ТАКЖЕ произойдет позже.
[редактировать после редактирования вопроса]
Пересылка не предназначена для ответа / подтверждения-после-публикации - используйте для этого перенаправление. $ this -> _ helper-> redirector-> gotoUrl ()
и т. Д.
Пересылка используется, когда внешнее перенаправление не является правильным вариантом. Пример использования (немного неудобно, но лучше я могу придумать): У вас есть форма, в которую можно добавить вашего питомца (собаку или кошку). У вас разные модели для каждой. Вы включаете в форму выбор, чтобы выбрать собаку / кошку. Затем в своем действии вы делаете:
if($form->isValid($_POST)){
switch($form->select->getValue()){
case "dog":
$this->_forward('add-dog','pets','default');
break;
case "cat":
$this->_forward('add-cat','pets','default');
break;
}
}
И обрабатываете разные вещи для кошек и собак в отдельных действиях. Преимущество этого заключается в том, что отправляются ВСЕ параметры. Если вы использовали $ this -> _ redirect (), параметры POST будут потеряны. В некоторых случаях это предполагаемое поведение (например, после добавления комментария вы делаете перенаправление на страницу со списком комментариев, чтобы избежать двойных публикаций, и появляется сообщение «странице необходимо снова отправить данные ...»
Я думаю, важно отметить, что _forward очень неэффективен, и вы всегда должны вызывать свой метод напрямую. Когда вы выполняете _forward, init (), до и после отправки запускаются снова. В зависимости от того, что у вас есть в вашем init, вы можете запустить (и вставить) одну и ту же запись базы данных дважды.
Этим легко пользоваться, но расточительно. Если вы профилируете свой код и ломаете голову над тем, почему все вызывается дважды, причиной является _forward. Если вам нравится я, и вы создаете несколько объектов в init () для использования во всем классе, вы создадите все дважды! Я провел нагрузочное тестирование своего кода и получил лучшую производительность, вызвав имя действия напрямую, например foo (), вместо _forward ('foo');
Еще один совет не по теме, который, я думаю, знает большинство людей, это использование single кавычки везде, где это возможно, так как синтаксический анализатор PHP должен проверять строку на наличие встроенных переменных. Я не знаю, какую реальную производительность это даст, особенно если вы используете кеш опкодов, но это лучшая практика.