/vendor/bundles/Sensio/Bundle/FrameworkExtraBundle/EventListener/TemplateListener.php
https://github.com/proclamo/txinbometro · PHP · 160 lines · 84 code · 26 blank · 50 comment · 12 complexity · 46d1417da64dfdfae13bc2c7edfe5d7e MD5 · raw file
- <?php
- namespace Sensio\Bundle\FrameworkExtraBundle\EventListener;
- use Symfony\Component\DependencyInjection\ContainerInterface;
- use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
- use Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent;
- use Symfony\Component\HttpFoundation\Response;
- use Symfony\Component\HttpFoundation\Request;
- use Symfony\Bundle\FrameworkBundle\Templating\TemplateReference;
- use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
- /*
- * 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 TemplateListener class handles the @Template annotation.
- *
- * @author Fabien Potencier <fabien@symfony.com>
- */
- class TemplateListener
- {
- /**
- * @var Symfony\Component\DependencyInjection\ContainerInterface
- */
- protected $container;
- /**
- * Constructor.
- *
- * @param ContainerInterface $container The service container instance
- */
- public function __construct(ContainerInterface $container)
- {
- $this->container = $container;
- }
- /**
- * Guesses the template name to render and its variables and adds them to
- * the request object.
- *
- * @param FilterControllerEvent $event A FilterControllerEvent instance
- */
- public function onKernelController(FilterControllerEvent $event)
- {
- if (!is_array($controller = $event->getController())) {
- return;
- }
- $request = $event->getRequest();
- if (!$configuration = $request->attributes->get('_template')) {
- return;
- }
- if (!$configuration->getTemplate()) {
- $configuration->setTemplate($this->guessTemplateName($controller, $request));
- }
- $request->attributes->set('_template', $configuration->getTemplate());
- $request->attributes->set('_template_vars', $configuration->getVars());
- // all controller method arguments
- if (!$configuration->getVars()) {
- $r = new \ReflectionObject($controller[0]);
- $vars = array();
- foreach ($r->getMethod($controller[1])->getParameters() as $param) {
- $vars[] = $param->getName();
- }
- $request->attributes->set('_template_default_vars', $vars);
- }
- }
- /**
- * Renders the template and initializes a new response object with the
- * rendered template content.
- *
- * @param GetResponseForControllerResultEvent $event A GetResponseForControllerResultEvent instance
- */
- public function onKernelView(GetResponseForControllerResultEvent $event)
- {
- $request = $event->getRequest();
- $parameters = $event->getControllerResult();
- if (null === $parameters) {
- if (!$vars = $request->attributes->get('_template_vars')) {
- if (!$vars = $request->attributes->get('_template_default_vars')) {
- return;
- }
- }
- $parameters = array();
- foreach ($vars as $var) {
- $parameters[$var] = $request->attributes->get($var);
- }
- }
- if (!is_array($parameters)) {
- return $parameters;
- }
- if (!$template = $request->attributes->get('_template')) {
- return $parameters;
- }
- $event->setResponse(new Response($this->container->get('templating')->render($template, $parameters)));
- }
- /**
- * Guesses and returns the template name to render based on the controller
- * and action names.
- *
- * @param array $controller An array storing the controller object and action method
- * @param Request $request A Request instance
- * @return TemplateReference template reference
- * @throws \InvalidArgumentException
- */
- protected function guessTemplateName($controller, Request $request)
- {
- if (!preg_match('/Controller\\\(.+)Controller$/', get_class($controller[0]), $matchController)) {
- throw new \InvalidArgumentException(sprintf('The "%s" class does not look like a controller class (it must be in a "Controller" sub-namespace and the class name must end with "Controller")', get_class($controller[0])));
- }
- if (!preg_match('/^(.+)Action$/', $controller[1], $matchAction)) {
- throw new \InvalidArgumentException(sprintf('The "%s" method does not look like an action method (it does not end with Action)', $controller[1]));
- }
- $bundle = $this->getBundleForClass(get_class($controller[0]));
- return new TemplateReference($bundle->getName(), $matchController[1], $matchAction[1], $request->getRequestFormat(), 'twig');
- }
- /**
- * Returns the Bundle instance in which the given class name is located.
- *
- * @param string $class A fully qualified controller class name
- * @param Bundle $bundle A Bundle instance
- * @throws \InvalidArgumentException
- */
- protected function getBundleForClass($class)
- {
- $namespace = strtr(dirname(strtr($class, '\\', '/')), '/', '\\');
- foreach ($this->container->get('kernel')->getBundles() as $bundle) {
- if (0 === strpos($namespace, $bundle->getNamespace())) {
- return $bundle;
- }
- }
- throw new \InvalidArgumentException(sprintf('The "%s" class does not belong to a registered bundle.', $class));
- }
- }