在每个页面上调用路由

I have a question. I added a new service PopupListener.php:

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 }

The triggerPopupAction :

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

I want that at each route call the new route added : app_popup_trigger. I made somethink like that but not work. The route is not called. Can you help me please ?

Basically use FOSJsRoutingBundle and trigger your route with javascript. That will be easier than listeners for a popup.

To call a specific route at the start of every request, you just need to extend your code in your PopupListener:

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 will start a new request-response cycle just for this sub-request and will return the $response of this cycle. Then you have to decide what you are doing with that reponse.

And then add the additional service to your service configuration:

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

You can get more information about symfony sub-requests here: The HttpKernel Component - Sub Request. I linked the documentation for Symfony 2.3. But keep in mind Symfony 2.3 is not maintained anymore and you should consider upgrading to 3.x.