<?php 
 
/* 
 * This file is part of EC-CUBE 
 * 
 * Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved. 
 * 
 * http://www.ec-cube.co.jp/ 
 * 
 * For the full copyright and license information, please view the LICENSE 
 * file that was distributed with this source code. 
 */ 
 
namespace Eccube\EventListener; 
 
use Symfony\Component\EventDispatcher\EventSubscriberInterface; 
use Symfony\Component\HttpKernel\Event\ControllerEvent; 
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; 
use Symfony\Component\HttpKernel\KernelEvents; 
 
/** 
 * Check to ForwardOnly annotation. 
 * 
 * @author Kentaro Ohkouchi 
 */ 
class ForwardOnlyListener implements EventSubscriberInterface 
{ 
    /** 
     * Kernel Controller listener callback. 
     * 
     * @param FilterControllerEvent $event 
     */ 
    public function onController(ControllerEvent $event) 
    { 
        if (!$event->isMainRequest()) { 
            return; 
        } 
 
        if (!is_array($event->getController())) { 
            return; 
        } 
 
        $request = $event->getRequest(); 
        $attributes = $request->attributes; 
 
        $forwardOnly = $attributes->has('_forward_only'); 
 
        if ($forwardOnly) { 
            $message = sprintf('%s is Forward Only', $attributes->get('_controller')); 
            throw new AccessDeniedHttpException($message); 
        } 
    } 
 
    /** 
     * Return the events to subscribe to. 
     * 
     * @return array 
     */ 
    public static function getSubscribedEvents() 
    { 
        return [ 
            KernelEvents::CONTROLLER => 'onController', 
        ]; 
    } 
}