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