<?php 
 
/* 
 * This file is part of the Symfony package. 
 * 
 * (c) Fabien Potencier <fabien@symfony.com> 
 * 
 * For the full copyright and license information, please view the LICENSE 
 * file that was distributed with this source code. 
 */ 
 
namespace Symfony\Bundle\SecurityBundle\EventListener; 
 
use Symfony\Bundle\SecurityBundle\Security\FirewallMap; 
use Symfony\Component\HttpKernel\Event\FinishRequestEvent; 
use Symfony\Component\HttpKernel\Event\RequestEvent; 
use Symfony\Component\HttpKernel\KernelEvents; 
use Symfony\Component\Security\Http\Firewall; 
use Symfony\Component\Security\Http\FirewallMapInterface; 
use Symfony\Component\Security\Http\Logout\LogoutUrlGenerator; 
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; 
 
/** 
 * @author Maxime Steinhausser <maxime.steinhausser@gmail.com> 
 */ 
class FirewallListener extends Firewall 
{ 
    private $map; 
    private $logoutUrlGenerator; 
 
    public function __construct(FirewallMapInterface $map, EventDispatcherInterface $dispatcher, LogoutUrlGenerator $logoutUrlGenerator) 
    { 
        $this->map = $map; 
        $this->logoutUrlGenerator = $logoutUrlGenerator; 
 
        parent::__construct($map, $dispatcher); 
    } 
 
    public function configureLogoutUrlGenerator(RequestEvent $event) 
    { 
        if (!$event->isMainRequest()) { 
            return; 
        } 
 
        if ($this->map instanceof FirewallMap && $config = $this->map->getFirewallConfig($event->getRequest())) { 
            $this->logoutUrlGenerator->setCurrentFirewall($config->getName(), $config->getContext()); 
        } 
    } 
 
    public function onKernelFinishRequest(FinishRequestEvent $event) 
    { 
        if ($event->isMainRequest()) { 
            $this->logoutUrlGenerator->setCurrentFirewall(null); 
        } 
 
        parent::onKernelFinishRequest($event); 
    } 
 
    /** 
     * {@inheritdoc} 
     */ 
    public static function getSubscribedEvents() 
    { 
        return [ 
            KernelEvents::REQUEST => [ 
                ['configureLogoutUrlGenerator', 8], 
                ['onKernelRequest', 8], 
            ], 
            KernelEvents::FINISH_REQUEST => 'onKernelFinishRequest', 
        ]; 
    } 
}