2015-07-01 6 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'))); 
     } 
    } 
} 
Смежные вопросы