Я хотел бы, чтобы кто-то объяснил мне, что делает _forward, я не вижу, чтобы _forward также отображал прикрепленное представление к действию или просто выполнял действие.
Также возможно передать аргумент в $ this-> action в скрипте вида?
В более общем смысле, моя проблема заключается в том, как закодировать страницу подтверждения, допустим, пользователь вводит некоторые данные, и вы хотите показать ему подтверждение, является ли форвард для этого случая средним?
_forward – внутренняя переадресация. Если _redirect отправляет заголовок, который указывает браузеру клиента перейти к другому URL-адресу, _forward сообщает диспетчеру, чтобы внутренне перенаправить запрос в другое место.
Если вы считаете нормальный порядок отправки:
preDispatch() someAction() postDispatch()
Вызов _forward в любой точке этой прогрессии приведет к тому, что следующие шаги не будут выполнены. Поэтому, если вы вызываете _forward в preDispatch (), someAction () не будет вызываться и так далее. Если вы _forward () в someAction (), и вы используете помощник действий viewRenderer для рендеринга ваших представлений (вы позволяете фреймворку выбирать, какой визуальный сценарий визуализируется), тогда в someAction () не будет отображаться сценарий представления.
Когда запрос отправляется новому контроллеру / модулю, весь процесс отправки будет повторяться там.
Вы можете узнать, какие действия отправляются с помощью:
$action = $this->getRequest()->getParam('action');
$ action будет формой URL-адреса действия, поэтому, если метод называется именем someKindOfAction, $ action будет содержать «some-kind-of». Вы можете сделать это также для контроллеров и модулей.
Мой опыт работы с Zend ограничен, и я надеюсь, что я не покажу вам то, что вы уже видели, но согласно документам (12.7.6. Утилиты):
_forward ($ action, $ controller = null, $ module = null, array $ params = null): выполнить другое действие. Если вызвано в preDispatch (), запрошенное в настоящее время действие будет пропущено в пользу нового. В противном случае после обработки текущего действия будет выполнено действие, запрошенное в _forward ().
Так что это звучит как контекст, когда это называется вопросом. В последнем случае он сначала выполнит действие, из которого он был вызван, и выполнит перенаправленное действие. Исключением является то, что он вызывается из обработчика preDispatch
Я думаю, что важно отметить, что _forward очень неэффективен, и вы всегда должны называть свой метод напрямую. Когда вы делаете _forward, перезапуск init (), pre и post запускается снова. В зависимости от того, что у вас есть в вашем init, вы можете дважды запустить (и вставить) одну и ту же запись базы данных.
Он прост в использовании, но расточителен. Если вы прокомментируете свой код и стучите головой, почему все вызывается дважды, причина – причина. Если вы, как я, и вы создаете несколько объектов в init () для использования во всем классе, вы завершаете создание всего дважды! Я загрузил тестирование на свой код, и я получил лучшую производительность, назвав имя действия напрямую, например foo (), вместо _forward ('foo');
Еще один вопрос, который, как мне кажется, большинство людей знает, использует ли он одинарные кавычки, где это возможно, синтаксический анализатор PHP должен проверять строку для встроенных переменных. Я не знаю, сколько будет реальной работы в реальном мире, особенно если вы используете кеш-код операции, но это лучшая практика.
Вперед можно использовать, когда внешнее перенаправление не является правильным вариантом. Используйте случай (бит ankward, но лучше всего я могу составить): у вас есть форма, которая может добавить вашего питомца (собаку или кошку). У вас разные модели для каждого. Вы выбираете в своей форме, чтобы выбрать собаку / кошку. Затем в вашем действии вы выполните:
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; } }
по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; } }
по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 будут потеряны. То есть в некоторых случаях предполагаемое поведение (например, после добавления комментария вы делаете переадресацию на страницу списка комментариев, чтобы избежать двойных сообщений, а сообщение «страница должна отправить данные снова …».
Часть документов Framework, к которым я, клянусь, был там, объяснил рабочий процесс отправки на общем уровне. Theres эта диаграмма , но ее awefully сложная для того чтобы объяснить что _forward делает.
Когда в действии _forward установит $request->isDispatched = false
и настроит запрос для вызова контроллера / действия, указанного в _forward. Во время postDispatch проверяется isDispatched – если его false, все это снова запускается с использованием нового запроса.
Итак … Если в вашем действии вы вручную визуализируете представления, они все равно будут отображаться. Все, что происходит в действии, все равно произойдет, и после этого произойдет еще одно действие.
[править после редактирования вопроса]
Вперед не предназначен для ответа / подтверждения-после-после – используйте для этого перенаправление. $this->_helper->redirector->gotoUrl()
и т. д.