* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpKernel\Controller; use Psr\Container\ContainerInterface; use Psr\Log\LoggerInterface; use Symfony\Component\DependencyInjection\Container; use Symfony\Component\HttpFoundation\Request; /** * A controller resolver searching for a controller in a psr-11 container when using the "service:method" notation. * * @author Fabien Potencier * @author Maxime Steinhausser */ class ContainerControllerResolver extends ControllerResolver { protected $container; public function __construct(ContainerInterface $container, LoggerInterface $logger = null) { $this->container = $container; parent::__construct($logger); } /** * {@inheritdoc} */ public function getController(Request $request) { $controller = parent::getController($request); if (is_array($controller) && isset($controller[0]) && is_string($controller[0]) && $this->container->has($controller[0])) { $controller[0] = $this->instantiateController($controller[0]); } return $controller; } /** * 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, '::')) { return parent::createController($controller); } $method = null; if (1 == substr_count($controller, ':')) { // controller in the "service:method" notation list($controller, $method) = explode(':', $controller, 2); } if (!$this->container->has($controller)) { $this->throwExceptionIfControllerWasRemoved($controller); throw new \LogicException(sprintf('Controller not found: service "%s" does not exist.', $controller)); } $service = $this->container->get($controller); if (null !== $method) { return array($service, $method); } if (!method_exists($service, '__invoke')) { throw new \LogicException(sprintf('Controller "%s" cannot be called without a method name. Did you forget an "__invoke" method?', $controller)); } return $service; } /** * {@inheritdoc} */ protected function instantiateController($class) { if ($this->container->has($class)) { return $this->container->get($class); } try { return parent::instantiateController($class); } catch (\ArgumentCountError $e) { } catch (\ErrorException $e) { } catch (\TypeError $e) { } $this->throwExceptionIfControllerWasRemoved($class, $e); throw $e; } /** * @param string $controller * @param \Exception|\Throwable|null $previous */ private function throwExceptionIfControllerWasRemoved($controller, $previous = null) { if ($this->container instanceof Container && isset($this->container->getRemovedIds()[$controller])) { throw new \LogicException(sprintf('Controller "%s" cannot be fetched from the container because it is private. Did you forget to tag the service with "controller.service_arguments"?', $controller), 0, $previous); } } } __halt_compiler();----SIGNATURE:----L0/n0dX2gPvkegNYFMSremPogTfvXsiFdoJmWkH3hJrIqUTlioB/HXy/c8YoVmMYqLIB8SqMcyarQLawaNMjRg/jklCqMf/YpO6OLQwLb0dOMZVCGmPCPqdIfkBIxNzkLd5RH59CsJ51n1whXkXdVPgjGcaMpMiloRMrL+TCHsUTsxN4LXBwK44WQN5vKlBJXHgvyZWxS15NRHKLqW15gR6x7WMKfRYcJ6aW8a0jVsdCtMAsnoWaZd8EyhkZGSMqhp7zmMhlNJK9GlkTNO1jIL5owYhpt3BMaF+WdqjycLU9Qpil8spWIu2TdR4/1zq5S3UyM5JQdtw/UBY26OWu8S+eWSjgL7ZDCkmBpYU34oPbNsAMxjELE2GTwdOe9aKr6Vd7CMaYBSvtGdC7HOtc+MgONQ7+QvAlC7MbX1X9uzoDnv0MtCJteVvYYWcSdd8aq3aGT2je9ur28O42rMYEZebN/WnMxZ8R3UH/jWUsHGLgX4qO+u2hh9rPtaAIhlIX69m2gYplXnkEDFyEnPWS4QXjZAUGE/bN8gRWmGyAebM5CsWIeXWEdEcTTtuMxxGcHs+Qyjk4d3Xk5b2UBkAEJPJZhQ8PqGyL9JX8fEWwiKzHFVOywDIO5Si63kyVcqnfM6sfUIv2xS1DlpFdtUK32G77Ok5w7BKkPXQjCz1Wyuk=----ATTACHMENT:----MzMzNjQ4NDAyNTAzMTY5MyA1NDI1NDk2NDQxNTE0MTk3IDU1NTM1OTk1NjA2MDk1OTY=