123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- <?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\FrameworkBundle\Controller;
- use Psr\Log\LoggerInterface;
- use Symfony\Component\DependencyInjection\ContainerAwareInterface;
- use Symfony\Component\DependencyInjection\ContainerInterface;
- use Symfony\Component\HttpKernel\Controller\ControllerResolver as BaseControllerResolver;
- /**
- * @author Fabien Potencier <fabien@symfony.com>
- */
- class ControllerResolver extends BaseControllerResolver
- {
- protected $container;
- protected $parser;
- public function __construct(ContainerInterface $container, ControllerNameParser $parser, LoggerInterface $logger = null)
- {
- $this->container = $container;
- $this->parser = $parser;
- parent::__construct($logger);
- }
- /**
- * Returns a callable for the given controller.
- *
- * @param string $controller A Controller string
- *
- * @return mixed A PHP callable
- *
- * @throws \LogicException When the name could not be parsed
- * @throws \InvalidArgumentException When the controller class does not exist
- */
- protected function createController($controller)
- {
- if (false === strpos($controller, '::')) {
- $count = substr_count($controller, ':');
- if (2 == $count) {
- // controller in the a:b:c notation then
- $controller = $this->parser->parse($controller);
- } elseif (1 == $count) {
- // controller in the service:method notation
- list($service, $method) = explode(':', $controller, 2);
- return array($this->container->get($service), $method);
- } elseif ($this->container->has($controller) && method_exists($service = $this->container->get($controller), '__invoke')) {
- return $service;
- } else {
- throw new \LogicException(sprintf('Unable to parse the controller name "%s".', $controller));
- }
- }
- return parent::createController($controller);
- }
- /**
- * {@inheritdoc}
- */
- protected function instantiateController($class)
- {
- if ($this->container->has($class)) {
- return $this->container->get($class);
- }
- $controller = parent::instantiateController($class);
- if ($controller instanceof ContainerAwareInterface) {
- $controller->setContainer($this->container);
- }
- return $controller;
- }
- }
|