2015-07-01 45 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'))); 
     } 
    } 
}