Zend_Controller_Action _forward случаи использования (или злоупотребления) - PullRequest
4 голосов
/ 17 ноября 2010

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

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

Ответы [ 3 ]

4 голосов
/ 17 ноября 2010

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

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

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

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

Первый:

$this->_forward('some')

Во-вторых:

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

Третье:

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

Четвертое:

return $this->someAction();
// executed?
1 голос
/ 18 ноября 2010

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

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

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

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

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

0 голосов
/ 17 ноября 2010

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

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

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

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

...