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

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

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

3 ответа

Решение

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

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

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

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

Первый:

$this->_forward('some')

Во-вторых:

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

В третьих:

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

В-четвертых:

return $this->someAction();
// executed?

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам