3 Stimmen

Zend Framework: Wie kann ich die endgültige Ausgabe der Ansicht abgreifen, bevor sie an den Browser gesendet wird?

Ich versuche, auf die endgültige Xhtml-Ausgabe zuzugreifen, kurz bevor sie als String an den Browser gesendet wird. Die postDispatch()-Methoden der Aktionen und Plugins scheinen zu früh zu sein, um dies zu tun. Wenn ich den Schritt durch Zend_Controller_Front::dispatch() Methode mit einem Debugger, kann ich die gewünschte Ausgabe als String direkt vor $this->_response->sendResponse() wird ganz am Ende durch Hinzufügen eines Watch-Ausdrucks aufgerufen $this->getResponse()->getBody() . Es scheint jedoch keinen speziellen Haken zu geben, den man genau dort anzapfen kann. Ich benötige den endgültigen Antwortkörper als String, um ihn an Prince XML zu senden und ein PDF zu erzeugen. Kennt jemand eine elegante Möglichkeit, dies zu tun?

Danke, Adrian

9voto

Stefan Gehrig Punkte 80686

En Zend_Controller_Front Plugin-Haken sind die folgenden (von aquí ):

  • routeStartup() aufgerufen wird, bevor Zend_Controller_Front ruft den Router auf, die Anfrage anhand der registrierten Routen zu bewerten.
  • routeShutdown() wird aufgerufen, nachdem der Router die Weiterleitung der Anfrage abgeschlossen hat.
  • dispatchLoopStartup() aufgerufen wird, bevor Zend_Controller_Front in seine Versandschleife ein.
  • preDispatch() wird aufgerufen, bevor eine Aktion vom Dispatcher versendet wird. Dieser Callback ermöglicht ein Proxy- oder Filterverhalten. Durch Ändern der Anfrage und Zurücksetzen ihres Dispatched-Flags (über Zend_Controller_Request_Abstract::setDispatched(false) ), kann die aktuelle Aktion übersprungen und/oder ersetzt werden.
  • postDispatch() wird aufgerufen, nachdem eine Aktion vom Dispatcher abgewickelt wurde. Dieser Callback ermöglicht ein Proxy- oder Filterverhalten. Durch Ändern der Anfrage und Zurücksetzen ihres Dispatched-Flags (über Zend_Controller_Request_Abstract::setDispatched(false) ), kann eine neue Aktion für die Abfertigung angegeben werden.
  • dispatchLoopShutdown() wird aufgerufen nachdem Zend_Controller_Front seine Dispatch Schleife verlassen hat.

Also dispatchLoopShutdown() ist Ihr Haken zum Mitnehmen - es ist das letzte, was Zend_Controller_Front::dispatch() bevor die Antwort zurückgegeben oder gesendet wird.

Eine andere Möglichkeit wäre, auch wenn sie für etwas ganz anderes konzipiert wurden, die Verwendung von Zend_View Filter. Diese Filter können in der Zend_View -Instanz und werden aufgerufen in Zend_View::render() . Ein Filter ist einfach eine Instanz einer Klasse, die eine filter($buffer) -Methode, die die gefilterten $buffer . Aber die Verwendung dieser Schnittstelle für etwas, das nicht mit der Filtrieren die Öffnung, was eigentlich nicht der richtige Weg zu sein scheint.

Ich persönlich denke, dass ein dispatchLoopShutdown() -Plugin ist der richtige Weg.

0voto

Yucieyurimoyq Punkte 109

Hier ein Beispiel für die Verwendung von Ansichtsfiltern

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X