Zend Framework: Как я могу подключиться к окончательному выводу представления перед его отправкой в ​​браузер? - PullRequest
3 голосов
/ 13 ноября 2009

Я пытаюсь получить доступ к окончательному выводу xhtml прямо перед его отправкой в ​​браузер в виде строки. Методы действий и плагинов postDispatch (), похоже, слишком рано для этого. Когда я выполняю метод Zend_Controller_Front::dispatch() с помощью отладчика, я могу получить доступ к желаемому выводу в виде строки непосредственно перед тем, как $this->_response->sendResponse() вызывается в самом конце, добавив выражение наблюдения $this->getResponse()->getBody(). Тем не менее, похоже, что нет никакого специального крючка, в который можно было бы тут попасть. Мне нужно окончательное тело ответа в виде строки, чтобы отправить его в Prince XML для создания PDF. Кто-нибудь знает элегантный способ сделать это?

Спасибо, Адриан

Ответы [ 2 ]

9 голосов
/ 13 ноября 2009

К подключаемым модулям Zend_Controller_Front относятся следующие (от здесь ):

  • routeStartup() вызывается до того, как Zend_Controller_Front вызовет маршрутизатор для оценки запроса по зарегистрированным маршрутам.
  • routeShutdown() вызывается после того, как маршрутизатор завершает маршрутизацию запроса.
  • dispatchLoopStartup() вызывается до того, как Zend_Controller_Front входит в цикл отправки.
  • preDispatch() вызывается до того, как диспетчер отправляет действие. Этот обратный вызов учитывает поведение прокси или фильтра. Изменяя запрос и сбрасывая его отправленный флаг (через Zend_Controller_Request_Abstract::setDispatched(false)), текущее действие можно пропустить и / или заменить.
  • postDispatch() вызывается после того, как диспетчер отправил действие. Этот обратный вызов учитывает поведение прокси или фильтра. Изменяя запрос и сбрасывая его отправленный флаг (через Zend_Controller_Request_Abstract::setDispatched(false)), можно указать новое действие для отправки.
  • dispatchLoopShutdown() вызывается после выхода Zend_Controller_Front из цикла отправки.

Так что dispatchLoopShutdown() - это ваш хук, который нужно сделать - это последнее, что Zend_Controller_Front::dispatch() делает перед возвратом или отправкой ответа.

Другим вариантом может быть, даже если они были разработаны для чего-то совершенно другого, использование фильтров Zend_View. Эти фильтры можно добавить к экземпляру Zend_View и вызвать в Zend_View::render(). Фильтр - это просто экземпляр класса, который предоставляет filter($buffer) -метод, который возвращает отфильтрованный $buffer. Но использование этого интерфейса для чего-то, не связанного с фильтрацией выхода, на самом деле, кажется, не совсем правильным.

Я лично думаю, что плагин dispatchLoopShutdown() будет подходить.

0 голосов
/ 30 августа 2013

Вот пример использования фильтров просмотра

http://matthewturland.com/2008/06/04/output-filters-in-zend_view/

...