Zend Framework, что делает $ this -> _ forward - PullRequest
21 голосов
/ 30 октября 2009

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

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

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

Ответы [ 5 ]

22 голосов
/ 30 октября 2009

_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». Вы можете сделать это также для контроллеров и модулей.

10 голосов
/ 30 октября 2009

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

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

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

9 голосов
/ 26 марта 2010

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

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

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

3 голосов
/ 30 октября 2009

Переадресация, которая будет использоваться, когда внешнее перенаправление не подходит. Случай использования (немного неудобно, но лучше всего я могу сделать): У вас есть форма, которая может добавить вашего питомца (собака или кошка). У вас есть разные модели для каждого. Вы включаете выбор в форму, чтобы выбрать собаку / кошку. Тогда в вашем действии вы делаете:

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

2 голосов
/ 30 октября 2009

Часть документации по Framework, которую я клянусь, раньше объясняла процесс диспетчеризации на общем уровне. Theres эта диаграмма , но ее ужасно сложно объяснить, что делает _forward.

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...