Zend_Controller_Action _forward случаи использования (или злоупотребления)

При разработке веб-приложения с использованием ZF у меня было ха-ха! момент относительно метода _forward в Zend_Controller_Action. Как указано в Справочном руководстве программиста, при вызове _forward внутри действия, запрошенное действие не будет выполнено, пока текущее действие не завершится. Это вызывает вопрос:

Когда бы вы использовали действие _forward, чтобы преднамеренно убедиться, что ваше текущее действие завершено, прежде чем начинать другое, помимо обработки формы (хотя вы, вероятно, все равно разместили бы запрос _forward в конце действия)? Какие есть яркие примеры этого? Какие-либо подводные камни или преимущества использования этого подхода по сравнению с ActionStack?


person Fatmuemoo    schedule 17.11.2010    source источник
comment
См. также: ActionStack на SO   -  person takeshin    schedule 18.11.2010


Ответы (3)


_forward() просто заменяет параметры модуля/контроллера/действия в объекте Request.

Он просто позволяет передумать на ходу (без повторной просьбы).

Это имеет разные последствия, в зависимости от того, какое состояние цикла диспетчеризации вызывается. Некоторое время setDispatched() необходимо для выполнения.

Рассмотрим эти сценарии:

Первый:

$this->_forward('some')

Второй:

return $this->_forward('some');

В третьих:

$this->someAction();
// ececuted?

Четвертое:

return $this->someAction();
// executed?
person takeshin    schedule 17.11.2010
comment
+1 за 2 примера. Мне никогда не приходило в голову, что _forward('some') == $this-›someAction(). Тем не менее, мне действительно интересно знать, когда его использовать, если я не использую его в качестве точки выхода, а также преимущества/недостатки по сравнению с помощником ActionShack. - person Fatmuemoo; 17.11.2010
comment
Основным недостатком ActionStack является множественный вызов цикла диспетчеризации. Вы наверняка избежите этого, используя return при переадресации на разные контроллеры или используйте $this->someAction() в одном и том же контроллере. Мой совет: всегда возвращайтесь. Это также хорошо для модульного тестирования. - person takeshin; 18.11.2010

Я действительно использую _forward только по двум причинам:

  1. Я хочу перенаправить, но не хочу, чтобы URL-адрес пользователя менялся.

  2. Я хочу передать некоторый (нестроковый) объект другому действию.

    $this->_forward('index', null, null, array('create_task_form' => $form));

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

person Derek Illchuk    schedule 17.11.2010
comment
Во втором примере вы просто можете использовать $this->indexAction($form). - person takeshin; 18.11.2010

Когда бы вы использовали действие _forward, чтобы намеренно убедиться, что ваше текущее действие завершено, прежде чем начинать другое

Я не думаю, что он используется для завершения текущего действия до использования _forward(). Это больше похоже на вызов логики вашего домена (модель, служба и т. д.), чем на обработку запроса, для чего и предназначено действие.

yourAction
  if(conditionsAreNotMet()) {
     return _forward(anotherAction);
  }

Я думаю, что _forward() предназначен для того, чтобы иметь точку раннего выхода в вашем действии (эта логика сосредоточена на одном, например, на представлении новостей); без необходимости выполнять другой запрос (например, _redirect()) и, таким образом, увеличивать нагрузку на веб-сервер.

person chelmertz    schedule 17.11.2010
comment
Ага! Но это вовсе не точка выхода. Если вы вызовете _forward() в своем действии, оно не будет пересылаться до тех пор, пока текущее действие не завершится. Вы можете вернуть _forward для выхода, но простой вызов _forward не приведет к выходу из текущего действия. - person Fatmuemoo; 17.11.2010
comment
@Fatmuemoo: я согласен с вашими точками зрения, но точка раннего выхода - единственная причина, по которой я когда-либо ее использовал, потому что: если я знаю, где что-то _forward(), то у меня, вероятно, есть все предпосылки для обработки запроса в том же действии. Я предпочел бы иметь несколько повторяющихся вызовов моделей/сервисов, чем заказывать _forward() для действия, которое, как я знаю, в настоящее время означает логическое продолжение моего первого действия, но вполне может измениться, поскольку другое действие никогда не должны иметь какие-либо зависимости. Может быть, я просто еще не видел реального варианта использования, а у вас есть? :) - person chelmertz; 18.11.2010