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
по двум причинам:
Я хочу перенаправить, но не хочу, чтобы URL пользователя менялся.
Я хочу передать некоторый (не строковый) объект другому действию.
$this->_forward('index', null, null, array('create_task_form' => $form));
В каждом случае целевое действие может стоять само по себе, без инициатора, и, как правило, просто маршалирует на дисплее.
Когда вы будете использовать действие _forward, чтобы преднамеренно убедиться, что ваше текущее действие завершено, прежде чем начинать другое?
Я не думаю, что это используется, чтобы позволить текущему действию завершиться до _forward()
используется. Это больше похоже на вызов вашей доменной логики (модель, сервис, что-то в этом роде), чем на обработку запроса, для которого предназначено действие.
yourAction
if(conditionsAreNotMet()) {
return _forward(anotherAction);
}
Я думаю _forward()
предоставляется возможность иметь раннюю точку выхода в вашем действии (вся логика сосредоточена на одной вещи, например, на представлении новостей); без необходимости выполнения другого запроса (например, _redirect()
) и тем самым увеличивая нагрузку на веб-сервер.