2009-10-30 7 views
21

Мне хотелось бы, чтобы кто-то объяснил мне, что делает _forward, я не вижу, чтобы _forward также отображал прикрепленное представление к действию или просто выполнял действие.

Также возможно передать аргумент $ this-> action в скрипте вида?

В общем, моя проблема заключается в том, как закодировать страницу подтверждения, допустим, пользователь вводит некоторые вещи, и вы хотите показать ему подтверждение, является ли это прямым для этого случая?

+0

@jldupont спасибо за тег редактировать забыл php ^^ – RageZ

+0

Я добавил несколько слов к своему вопросу – RageZ

ответ

22

_forward - внутренняя переадресация. Если _redirect отправляет заголовок, который указывает браузеру клиента перейти к другому URL-адресу, _forward сообщает диспетчеру, чтобы внутренне перенаправить запрос в другое место.

Если вы считаете, нормальный порядок диспетчерского:

preDispatch() 
someAction() 
postDispatch() 

Calling _forward в любой момент в этой прогрессии будет вызывать следующие шаги, чтобы не быть выполнены. Поэтому, если вы вызываете _forward в preDispatch(), someAction() не будет вызываться и так далее. Если вы _forward() в someAction(), и вы используете помощник действий viewRenderer для рендеринга ваших представлений (вы позволяете фреймворку выбирать, какой визуальный сценарий визуализируется), тогда в someAction() не будет отображаться сценарий представления.

Когда запрос отправляется новому контроллеру/модулю, весь процесс отправки будет там повторен.

Вы можете узнать, какие действия, которые направляются с помощью:

$action = $this->getRequest()->getParam('action'); 

$ действие будет URL форма действия, так что если метод имя «someKindOfAction», $ действие будет содержать «some- вид'. Вы можете сделать это также для контроллеров и модулей.

9

Мой опыт работы с Zend ограничен, и я надеюсь, что я не показывая вам то, что вы уже видели, но according to the docs (. 12.7.6 Utility методы):

_forward ($ действие, $ контроллер = null, $ module = null, array $ params = null): выполнить другое действие. Если вызвано в preDispatch(), запрошенное в настоящее время действие будет пропущено в пользу нового. В противном случае после обработки текущего действия будет выполнено действие, запрошенное в _forward().

Это звучит как контекст, когда это называется вопросом. В последнем случае он сначала выполнит действие, из которого оно было вызвано , затем выполнить перенаправленное действие. Исключение составляет то, когда он вызывается из preDispatch обработчик

+0

karim спасибо за ответ, но я встречал несколько случаев, что дела не делали, что я ожидаю .. плюс я нахожу Док (по крайней мере) этот один из таинственных. также, что произойдет, если я вызову $ this-> forward, и я уже в действии. – RageZ

2

Часть документов Framework, к которым я клянусь, был объяснен рабочий процесс отправки на общем уровне. Theres this diagram, но его довольно сложно объяснить, что делает _forward.

Когда в действии _forward установит $request->isDispatched = false и настроит запрос на вызов контроллера/действия, указанного в _forward. Во время postDispatch проверяется isDispatched - если его false, все это снова запускается с использованием нового запроса.

Итак ... Если в вашем действии вы вручную визуализируете представления, они все равно будут отображаться. Все, что происходит в действии, все равно произойдет, и после этого произойдет еще одно действие.

[править после вопроса редактировать]

Форвард не предназначен для ответа/подтверждения-после-пост - использовать редирект для этого. $this->_helper->redirector->gotoUrl() и т. Д.

+2

. Теперь изображение схемы не выполняется. – leek

3

Вперед есть возможность использовать, когда внешнее перенаправление не является правильным вариантом. Использовать случай (бит 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 будут потеряны. То есть в некоторых случаях предполагаемое поведение (например, после добавления комментария вы делаете переадресацию на страницу списка комментариев, чтобы избежать двойных сообщений, и сообщение «страница должна отправить данные снова ...».

9

Я думаю, что важно обратите внимание, что _forward очень неэффективен, и вы всегда должны вызывать свой метод напрямую. Когда вы делаете _forward, перезапуск init(), pre и post запускается снова. В зависимости от того, что у вас есть в init, вы можете запускать (и вставлять) одна и та же запись базы данных дважды.

Это прост в использовании, но расточительно. Если вы прокомментируете свой код и стучите головой, почему все вызывается дважды, причина - причина. Если вы, как я, и вы создаете экземпляр несколько объектов в init() для использования во всем классе, вы завершаете создание всего t Вайс! Я загрузил тестирование на свой код, и я получил лучшую производительность, назвав имя действия напрямую, например foo(), вместо _forward ('foo');

Еще один вопрос с темой. Я думаю, что большинство людей знает, использует ли он везде одинарные кавычки, синтаксический анализатор PHP должен проверять строку для встроенных переменных. Я не знаю, сколько будет реальной работы в реальном мире, особенно если вы используете кеш-код операции, но это лучшая практика.

+0

Я вижу, что ваша точка с отправкой снова запускалась, единственное, когда вы хотите переслать в том же контроллере, который вызывает метод напрямую, лучше, но когда это другой контроллер, вам, вероятно, придется инициализировать много вещей вручную, т. Е. '$ This- > _request' – RageZ

+0

, и в моем случае я использую это также для проверки входа в систему, то есть эта страница должна быть аутентифицирована, но вы не показываете страницу входа ... и мой код входа/выхода всегда находится в отдельном контроллере (в большинстве случаев case) – RageZ

+0

Дэн, я считаю, что ваше утверждение частично неверно: «Когда вы делаете _forward, перезапуск init(), pre и post запускается снова. В зависимости от того, что у вас есть в init, вы можете запускать (и вставлять) то же самое запись базы данных дважды ". На самом деле, init вызывается только один раз, в конструирующем устройстве ... отправка до и после вызывается несколько раз. – joedevon