2017-09-05 6 views
0

Ich habe eine Frage. Ich habe einen neuen Service PopupListener.php: Rufen Sie eine Route auf jeder Seite

use Symfony\Bundle\FrameworkBundle\Routing\Router; 
use Symfony\Component\DependencyInjection\ContainerInterface; 


class PopupListener 
{ 
    protected $router; 

    public function __construct(Router $router) 
    { 
     $this->router = $router; 
    } 

    public function onKernelRequest() 
    { 
     $this->router->generate('app_popup_trigger'); 
    } 
} 

services.yml:

popup_listener: 
    class: App\DesktopBundle\Listeners\PopupListener 
    arguments: ["@router"] 
    tags: 
     - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest } 

routing.yml:

app_popup_trigger: 
    path: /popup/trigger 
    defaults: { _controller: AppDesktopBundle:Popup:triggerPopup } 

Die triggerPopupAction:

class PopupController extends Controller{ 
    public function triggerPopupAction(){ 
     return $this->render('AppDesktopBundle:Popup:index.html.twig', array()); 
    } 
} 

Ich möchte, dass bei jeder Route die neue Route hinzugefügt wird: app_popup_trigger. Ich habe sowas gemacht, aber nicht gearbeitet. Die Route wird nicht aufgerufen. Kannst du mir bitte helfen ?

+0

Symfony 2.3 wird nicht mehr gepflegt. Sie sollten auf Symfony 3.x aktualisieren. Außerdem verstehe ich nicht wirklich, was Sie erreichen wollen. Was bedeutet "Ich möchte, dass bei jeder Route die neue Route hinzugefügt wird:' app_popup_trigger' "bedeutet? –

+0

Die Idee ist, bei jeder Anfrage diese API 'app_popup_trigger' aufzurufen. – user7424312

Antwort

1

Verwenden Sie grundsätzlich FOSJsRoutingBundle und triggern Sie Ihre Route mit Javascript. Das wird einfacher als Listener für ein Popup sein.

0

Um eine bestimmte Strecke zu Beginn jeder Anfrage aufrufen, die Sie gerade Ihren Code in Ihre PopupListener erweitern müssen:

use Symfony\Bundle\FrameworkBundle\Routing\Router; 
use Symfony\Component\DependencyInjection\ContainerInterface; 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpKernel\Event\GetResponseEvent; 
use Symfony\Component\HttpKernel\HttpKernelInterface; 

class PopupListener 
{ 
    protected $router; 

    protected $httpKernel; 

    public function __construct(Router $router, HttpKernelInterface $httpKernel) 
    { 
     $this->router = $router; 
     $this->httpKernel = $httpKernel; 
    } 

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

     $subRequest = Request::create($this->router->generate('app_popup_trigger')); 
     $response = $this->httpKernel->handle($subRequest, HttpKernelInterface::SUB_REQUEST); 
     // do something with the $response here 
    } 
} 

Symfony wird nur für diese Unteranfrage einen neuen Request-Response-Zyklus beginnen und wird die $response dieses Zyklus zurückgeben. Dann müssen Sie entscheiden, was Sie mit dieser Antwort tun.

Und dann den zusätzlichen Service, um Ihre Service-Konfiguration hinzufügen:

popup_listener: 
    class: App\DesktopBundle\Listeners\PopupListener 
    arguments: ["@router", "@http_kernel"] 
    tags: 
     - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest } 

Sie können hier weitere Informationen über symfony Unter Anfragen erhalten: The HttpKernel Component - Sub Request. Ich habe die Dokumentation für Symfony 2.3 verlinkt. Denken Sie jedoch daran, dass Symfony 2.3 nicht mehr gepflegt wird und Sie ein Upgrade auf 3.x in Erwägung ziehen sollten.

+0

Ich bekomme den Fehler:' "Keine Route gefunden für" GET /app_dev.php/popup/trigger "" unter/var/www/app/vendor/symfony/symfony/src/Symfony/Komponente/HttpKernel/EventListener/RouterListener.php' – user7424312

+0

Was passiert, wenn Sie einfach '/ app_dev.php/popup/trigger' in Ihrem Browser anfordern? –

Verwandte Themen