* * 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:----G4MtWx0P+JpF1GCkhIxYvdtFPiqYlgnIom6HQ/o8RnKLdkVTBMNmt9sN+99jOuGzyitOfKF3Vy/rqrkBbk89TBL/uj96qG88C4WAVVi655NNHcuwQy4E4iy5QQkotzYsDy/bvPY68vmWdxJIzPnNcSnGIbRIN2qQg2u2IHGB10Opu9MKsTbOTI3xZJxBH8yoBRClLMn0swnK2SdtUy5tqeEK2j5WqTcl2rtj2RFoajyZ7ROejMQqmoruu9FRMd6Zekd1WwJUKABT92fKhRSZtfhR3619mHdxuUqsPs71+GU0ZOSaPabf4nPh969qLZBEo3nijw1vPOwvwhyn5jSbbcFFKyq4UPTFpRTNoL+DT2GUbp/7YIASafAb+G8qjBk525199SSWy+B03gbeoUbCt1Vcwu5bltxaa7Xak+U/nqMPgWncilpgdWZz0fDqESCXmThBnGBLcOS1G92ohVM+ieTJV+rwMoJOZJUR/Uct5PevD16+LA8sJ9Kq8FodsBjeRDmvNqaGrN6SyPNakeqZfAnxp/WGstmsZlpWflGfRWRG2ZR16E7eVZewIb4C0SETBmDcu3s9UZxwgN1rFpaviwyIqeE0JMHE9V7l/H0FaXVwOtWxgL2hb+zSmluHek/69wWw4VPdpzUeMZ9+qCWuYlSsvbrGEUfQ5h5fhJhNdOE=----ATTACHMENT:----MzM1MjcxNjA1NTY4MDA2OCA4NTY5NTY1NTI3Mzc1ODI1IDc4NTU2OTUwNjQ2MTAyNzE=