Платформа зенда, что вперед делает $this-> _

Сценарий ~/.bash_profile выполняется на входе в систему.

21
задан Benjamin 27 October 2013 в 21:38
поделиться

5 ответов

_forward - это внутреннее перенаправление. В то время как _redirect отправляет заголовок, который сообщает браузеру клиента перейти к другому URL-адресу, _forward сообщает диспетчеру о необходимости внутреннего перенаправления запроса в другое место.

Если вы считаете нормальный порядок отправки:

 preDispatch()
 someAction()
 postDispatch()

Вызов _forward в любой момент в этом случае следующие шаги не будут выполнены. Поэтому, если вы вызываете _forward в preDispatch (), someAction () не будет вызываться и так далее. Если вы используете _forward () в someAction () и используете помощник действий viewRenderer для рендеринга ваших представлений (вы позволяете фреймворку выбирать, какой сценарий представления визуализировать), то в someAction () не будет отображаться сценарий представления.

Когда запрос пересылается новому контроллеру / модулю, весь процесс отправки будет повторяться там.

Вы можете узнать, какое действие отправляется, используя:

 $action = $this->getRequest()->getParam('action');

$ action будет формой URL для action, поэтому, если у метода есть имя someKindOfAction, $ action будет содержать some-kind-of. То же самое можно сделать и для контроллеров и модулей.

22
ответ дан 29 November 2019 в 20:17
поделиться

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

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

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

10
ответ дан 29 November 2019 в 20:17
поделиться

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

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

Итак ... Если в вашем действии вы вручную визуализируете представления, они все равно будут отображаться. Все в действии по-прежнему будет происходить, просто другое действие ТАКЖЕ произойдет позже.

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

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

2
ответ дан 29 November 2019 в 20:17
поделиться

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

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

3
ответ дан 29 November 2019 в 20:17
поделиться

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

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

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

9
ответ дан 29 November 2019 в 20:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: