2015-07-01 42 views
0

如果會話未設置,如何將用戶重定向到主頁面?這裏的會話只是他們在輸入字段中輸入的名稱。如果沒有設置會話,重定向特定路由

如果我使用條件檢查控制器的方法中的會話,代碼將重複。有沒有辦法像Laravel那樣對路線進行分組並應用配置?

一個重複的代碼:

if($this->get('session')->get('fbSession')) 
     return $this->redirectToRoute('app_home'); 
+0

你可以發佈你的努力,只是重複的代碼? – Jon

+0

@Jon問題已更新。 – Raaz

回答

0

如果要進行這樣的檢查,以指定的路由,就可以實現對內核請求事件事件偵聽器。

parameters.yml

routes_list: 
    - app_messages 
    - app_profile 
    - app_something 

的services.xml

<service id="app.session_listener" class="AppBundle\EventListener\SessionListener"> 
    <tag name="kernel.event_subscriber"/> 
    <argument type="service" id="router"/> 
    <argument>%routes_list%</argument> 
</service> 

SessionLisener.php

<?php 

namespace AppBundle\EventListener; 

use Symfony\Component\HttpFoundation\RedirectResponse; 
use Symfony\Component\HttpKernel\Event\GetResponseEvent; 
use Symfony\Component\HttpKernel\HttpKernel; 
use Symfony\Component\HttpKernel\KernelEvents; 
use Symfony\Component\EventDispatcher\EventSubscriberInterface; 
use Symfony\Component\Routing\RouterInterface; 

class SessionListener implements EventSubscriberInterface 
{ 
    /** 
    * @var RouterInterface 
    */ 
    private $router; 

    /** 
    * @var array 
    */ 
    private $routesList; 

    /** 
    * @param RouterInterface $router 
    * @param array $routesList 
    */ 
    public function __construct(RouterInterface $router, $routesList) 
    { 
     $this->router = $router; 
     $this->routesList = $routesList; 
    } 

    static public function getSubscribedEvents() 
    { 
     return [ 
      KernelEvents::REQUEST => array(array('onKernelRequest', -50)), 
     ]; 
    } 

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

     $request = $event->getRequest(); 
     if (! in_array($request->get('_route'), $this->routesList)) { 
      return; 
     } 

     if ($request->getSession()->has('fbSession')) { 
      $event->setResponse(new RedirectResponse($this->router->generate('app_home'))); 
     } 
    } 
}