Файл: concrete5.7.5.6/concrete/src/Controller/ApplicationAwareControllerResolver.php
Строк: 144
<?php
namespace ConcreteCoreController;
use ConcreteCoreApplicationApplication;
use ConcreteCoreApplicationApplicationAwareInterface;
use PsrLogLoggerInterface;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpKernelControllerControllerResolver as SymfonyControllerResolver;
class ApplicationAwareControllerResolver extends SymfonyControllerResolver implements ApplicationAwareInterface
{
/** @var Application */
protected $app;
/** @var PsrLogLoggerInterface */
protected $logger;
public function __construct(Application $app, LoggerInterface $logger = null)
{
$this->setApplication($app);
$this->logger = $logger;
}
/**
* Set the application object
*
* @param ConcreteCoreApplicationApplication $application
*/
public function setApplication(Application $application)
{
$this->app = $application;
}
/**
* {@inheritdoc}
*
* This method looks for a '_controller' request attribute that represents
* the controller name (a string like ClassName::MethodName).
*
* @api
*/
public function getController(Request $request)
{
if (!$controller = $request->attributes->get('_controller')) {
if (null !== $this->logger) {
$this->logger->warning('Unable to look for the controller as the "_controller" parameter is missing');
}
return false;
}
if (is_array($controller)) {
return $controller;
}
if (is_object($controller)) {
if (method_exists($controller, '__invoke')) {
return $controller;
}
throw new InvalidArgumentException(sprintf('Controller "%s" for URI "%s" is not callable.', get_class($controller), $request->getPathInfo()));
}
if (false === strpos($controller, ':')) {
if (method_exists($controller, '__invoke')) {
return $this->app->make($controller);
} elseif (function_exists($controller)) {
return $controller;
}
}
$callable = $this->createController($controller);
if (!is_callable($callable)) {
throw new InvalidArgumentException(sprintf('Controller "%s" for URI "%s" is not callable.', $controller, $request->getPathInfo()));
}
return $callable;
}
/**
* Returns a callable for the given controller.
*
* @param string $controller A Controller string
*
* @return mixed A PHP callable
*
* @throws InvalidArgumentException
*/
protected function createController($controller)
{
if (false === strpos($controller, '::')) {
throw new InvalidArgumentException(sprintf('Unable to find controller "%s".', $controller));
}
list($class, $method) = explode('::', $controller, 2);
if (!class_exists($class)) {
throw new InvalidArgumentException(sprintf('Class "%s" does not exist.', $class));
}
return array($this->app->make($class), $method);
}
}