diff --git a/core/lib/Drupal/Core/Controller/ControllerResolver.php b/core/lib/Drupal/Core/Controller/ControllerResolver.php index ad42c6c..f773b78 100644 --- a/core/lib/Drupal/Core/Controller/ControllerResolver.php +++ b/core/lib/Drupal/Core/Controller/ControllerResolver.php @@ -28,7 +28,7 @@ * controller by using a service:method notation (Symfony uses the same * convention). */ -class ControllerResolver extends BaseControllerResolver { +class ControllerResolver extends BaseControllerResolver implements ControllerResolverInterface { /** * The injection container that should be injected into all controllers. @@ -38,11 +38,18 @@ class ControllerResolver extends BaseControllerResolver { protected $container; /** + * The psr3 logger. (optional) + * + * @var \Psr\Log\LoggerInterface; + */ + protected $logger; + + /** * Constructs a new ControllerResolver. * - * @param Symfony\Component\DependencyInjection\ContainerInterface $container + * @param \Symfony\Component\DependencyInjection\ContainerInterface $container * A ContainerInterface instance. - * @param Symfony\Component\HttpKernel\Log\LoggerInterface $logger + * @param \Symfony\Component\HttpKernel\Log\LoggerInterface $logger * (optional) A LoggerInterface instance. */ public function __construct(ContainerInterface $container, LoggerInterface $logger = NULL) { @@ -52,6 +59,47 @@ public function __construct(ContainerInterface $container, LoggerInterface $logg } /** + * {@inheritdoc} + */ + public function getControllerFromAttribute($controller, $path = '') { + if (is_array($controller) || (is_object($controller) && method_exists($controller, '__invoke'))) { + return $controller; + } + + if (false === strpos($controller, ':')) { + if (method_exists($controller, '__invoke')) { + return new $controller; + } + elseif (function_exists($controller)) { + return $controller; + } + } + + $callable = $this->createController($controller); + + if (!is_callable($callable)) { + throw new \InvalidArgumentException(sprintf('The controller for URI "%s" is not callable.', $path)); + } + + return $callable; + } + + + /** + * {@inheritdoc} + */ + public function getController(Request $request) { + if (!$controller = $request->attributes->get('_controller')) { + if ($this->logger !== NULL) { + $this->logger->warning('Unable to look for the controller as the "_controller" parameter is missing'); + } + + return FALSE; + } + return $this->getControllerFromAttribute($controller, $request->getPathInfo()); + } + + /** * Returns a callable for the given controller. * * @param string $controller @@ -66,7 +114,7 @@ public function __construct(ContainerInterface $container, LoggerInterface $logg * @throws \InvalidArgumentException * If the controller class does not exist */ - public function createController($controller) { + protected function createController($controller) { // Controller in the service:method notation. $count = substr_count($controller, ':'); if ($count == 1) { diff --git a/core/lib/Drupal/Core/Controller/HtmlPageController.php b/core/lib/Drupal/Core/Controller/HtmlPageController.php index 77e39c5..33626f7 100644 --- a/core/lib/Drupal/Core/Controller/HtmlPageController.php +++ b/core/lib/Drupal/Core/Controller/HtmlPageController.php @@ -46,7 +46,7 @@ public function __construct(ControllerResolver $controller_resolver) { * A response object. */ public function content(Request $request, $_content) { - $callable = $this->controllerResolver->createController($_content); + $callable = $this->controllerResolver->getControllerFromAttribute($_content); $arguments = $this->controllerResolver->getArguments($request, $callable); $page_content = call_user_func_array($callable, $arguments); if ($page_content instanceof Response) {