Подтвердить что ты не робот

Zend Framework, что $this → _ forward делает

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

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

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

4b9b3361

Ответ 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() и т.д.