Source of file ControllerListener.php
Size: 3,942 Bytes - Last Modified: 2013-07-09T11:29:53+02:00
/home/theseer/Downloads/Symfony/vendor/sensio/framework-extra-bundle/Sensio/Bundle/FrameworkExtraBundle/EventListener/ControllerListener.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 | <?php namespace Sensio\Bundle\FrameworkExtraBundle\EventListener; use Doctrine\Common\Annotations\Reader; use Symfony\Component\HttpKernel\Event\FilterControllerEvent; use Symfony\Component\HttpKernel\KernelEvents; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Sensio\Bundle\FrameworkExtraBundle\Configuration\ConfigurationInterface; use Doctrine\Common\Util\ClassUtils; /* * This file is part of the Symfony framework. * * (c) Fabien Potencier <fabien@symfony.com> * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ /** * The ControllerListener class parses annotation blocks located in * controller classes. * * @author Fabien Potencier <fabien@symfony.com> */ class ControllerListener implements EventSubscriberInterface { /** * @var \Doctrine\Common\Annotations\Reader */ protected $reader; /** * Constructor. * * @param Reader $reader An Reader instance */ public function __construct(Reader $reader) { $this->reader = $reader; } /** * Modifies the Request object to apply configuration information found in * controllers annotations like the template to render or HTTP caching * configuration. * * @param FilterControllerEvent $event A FilterControllerEvent instance */ public function onKernelController(FilterControllerEvent $event) { if (!is_array($controller = $event->getController())) { return; } $className = class_exists('Doctrine\Common\Util\ClassUtils') ? ClassUtils::getClass($controller[0]) : get_class($controller[0]); $object = new \ReflectionClass($className); $method = $object->getMethod($controller[1]); $classConfigurations = $this->getConfigurations($this->reader->getClassAnnotations($object)); $methodConfigurations = $this->getConfigurations($this->reader->getMethodAnnotations($method)); $configurations = array(); foreach (array_merge(array_keys($classConfigurations), array_keys($methodConfigurations)) as $key) { if (!array_key_exists($key, $classConfigurations)) { $configurations[$key] = $methodConfigurations[$key]; } elseif (!array_key_exists($key, $methodConfigurations)) { $configurations[$key] = $classConfigurations[$key]; } else { if (is_array($classConfigurations[$key])) { if (!is_array($methodConfigurations[$key])) { throw new \UnexpectedValueException('Configurations should both be an array or both not be an array'); } $configurations[$key] = array_merge($classConfigurations[$key], $methodConfigurations[$key]); } else { // method configuration overrides class configuration $configurations[$key] = $methodConfigurations[$key]; } } } $request = $event->getRequest(); foreach ($configurations as $key => $attributes) { $request->attributes->set($key, $attributes); } } protected function getConfigurations(array $annotations) { $configurations = array(); foreach ($annotations as $configuration) { if ($configuration instanceof ConfigurationInterface) { if ($configuration->allowArray()) { $configurations['_'.$configuration->getAliasName()][] = $configuration; } else { $configurations['_'.$configuration->getAliasName()] = $configuration; } } } return $configurations; } public static function getSubscribedEvents() { return array( KernelEvents::CONTROLLER => 'onKernelController', ); } } |