dqtdz08206
dqtdz08206
2017-09-05 09:56

在每个页面上调用路由

已采纳

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 ?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

2条回答

  • douxi3554 douxi3554 4年前

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

    点赞 评论 复制链接分享
  • dongluoqiu0255 dongluoqiu0255 4年前

    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.

    点赞 评论 复制链接分享