2014-01-15 23 views
5

Ich verwende den Ereignis-Listener onKernelResponse.Symfony2: onKernelResponse zweimal aufgerufen als MASTER_REQUEST

Trotz habe ich:

if (HttpKernelInterface::MASTER_REQUEST != $event->getRequestType()) { 
    return; 
} 

Es ist ein MASTER_REQUEST zweimal in meiner Wirkung, gibt es einen vor den <!DOCTYPE html> <html> <head> etc, und die andere als nach dem Ende des Layouts vorbehalten.

Er ist mein services.yml:

history.listener: 
    class: VENDOR\MyBundle\Service\HistoryListener 
    arguments: [@doctrine.orm.entity_manager, @logger, @history] 
    tags: 
     - { name: kernel.event_listener, event: kernel.controller, method: onKernelController } 
     - { name: kernel.event_listener, event: kernel.response, method: onKernelResponse } 

Habe ich etwas falsch gemacht?

Antwort

8

Endlich gefunden den Ursprung des Problems: die Debug-Symbolleiste!

Es sendet tatsächlich eine Ajax-Anfrage, das heißt eine andere MASTER_REQUEST ..

Meine Lösung auf Controller zu filtern ist, mit einer weißen/schwarzen Liste des Namen des Controllers.

UPDATE:

Hier ist der Code verwende ich (so können Sie leicht einige andere Controller ausschließen, wenn erforderlich).

public function __construct() 
{ 
    $this->classesExcluded = array("Symfony\Bundle\WebProfilerBundle\Controller\ProfilerController"); 
} 


public function onKernelController(FilterControllerEvent $event) 
{ 
    $controller = $event->getController(); 

    if (!is_array($controller) || HttpKernelInterface::MASTER_REQUEST != $event->getRequestType() || in_array(get_class($controller[0]), $this->classesExcluded)) { 
     return; 
    } 
    // ... 
} 
+2

landete ich dies zu tun - 'strpos ($ event-> getRequest() -> Attributen-> get ('_ Controller'), 'WebProfilerBundle!') == false' nicht sicher, wie klug es ist aber der Trick. – codekipple

+0

Manchmal ist es Symfony \ Bundle \ FrameworkBundle \ Controller \ RedirectController, also möchten Sie es vielleicht auch ausschließen. – BentCoder

+0

In meinem Fall hatte ich das zweite Mal Symfony \ Bundle \ TwigBundle \ Controller \ ExceptionController. Ich musste einen Fehler beheben und alles hat gut funktioniert. – Strabek