Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
33.33% |
1 / 3 |
CRAP | |
80.95% |
51 / 63 |
resolver | |
0.00% |
0 / 1 |
|
33.33% |
1 / 3 |
20.24 | |
80.95% |
51 / 63 |
__construct | |
100.00% |
1 / 1 |
1 | |
100.00% |
5 / 5 |
|||
getController | |
0.00% |
0 / 1 |
10.35 | |
59.09% |
13 / 22 |
|||
getArguments | |
0.00% |
0 / 1 |
10.06 | |
91.67% |
33 / 36 |
<?php | |
/** | |
* | |
* This file is part of the phpBB Forum Software package. | |
* | |
* @copyright (c) phpBB Limited <https://www.phpbb.com> | |
* @license GNU General Public License, version 2 (GPL-2.0) | |
* | |
* For full copyright and license information, please see | |
* the docs/CREDITS.txt file. | |
* | |
*/ | |
namespace phpbb\controller; | |
use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface; | |
use Symfony\Component\DependencyInjection\ContainerInterface; | |
use Symfony\Component\HttpFoundation\Request; | |
/** | |
* Controller manager class | |
*/ | |
class resolver implements ControllerResolverInterface | |
{ | |
/** | |
* ContainerInterface object | |
* @var ContainerInterface | |
*/ | |
protected $container; | |
/** | |
* phpbb\template\template object | |
* @var \phpbb\template\template | |
*/ | |
protected $template; | |
/** | |
* Request type cast helper object | |
* @var \phpbb\request\type_cast_helper | |
*/ | |
protected $type_cast_helper; | |
/** | |
* phpBB root path | |
* @var string | |
*/ | |
protected $phpbb_root_path; | |
/** | |
* Construct method | |
* | |
* @param ContainerInterface $container ContainerInterface object | |
* @param string $phpbb_root_path Relative path to phpBB root | |
* @param \phpbb\template\template $template | |
*/ | |
public function __construct(ContainerInterface $container, $phpbb_root_path, \phpbb\template\template $template = null) | |
{ | |
$this->container = $container; | |
$this->template = $template; | |
$this->type_cast_helper = new \phpbb\request\type_cast_helper(); | |
$this->phpbb_root_path = $phpbb_root_path; | |
} | |
/** | |
* Load a controller callable | |
* | |
* @param \Symfony\Component\HttpFoundation\Request $request Symfony Request object | |
* @return bool|Callable Callable or false | |
* @throws \phpbb\controller\exception | |
*/ | |
public function getController(Request $request) | |
{ | |
$controller = $request->attributes->get('_controller'); | |
if (!$controller) | |
{ | |
throw new \phpbb\controller\exception('CONTROLLER_NOT_SPECIFIED'); | |
} | |
// Require a method name along with the service name | |
if (stripos($controller, ':') === false) | |
{ | |
throw new \phpbb\controller\exception('CONTROLLER_METHOD_NOT_SPECIFIED'); | |
} | |
list($service, $method) = explode(':', $controller); | |
if (!$this->container->has($service)) | |
{ | |
throw new \phpbb\controller\exception('CONTROLLER_SERVICE_UNDEFINED', array($service)); | |
} | |
$controller_object = $this->container->get($service); | |
/* | |
* If this is an extension controller, we'll try to automatically set | |
* the style paths for the extension (the ext author can change them | |
* if necessary). | |
*/ | |
$controller_dir = explode('\\', get_class($controller_object)); | |
// 0 vendor, 1 extension name, ... | |
if (!is_null($this->template) && isset($controller_dir[1])) | |
{ | |
$controller_style_dir = 'ext/' . $controller_dir[0] . '/' . $controller_dir[1] . '/styles'; | |
if (is_dir($this->phpbb_root_path . $controller_style_dir)) | |
{ | |
$this->template->set_style(array($controller_style_dir, 'styles')); | |
} | |
} | |
return array($controller_object, $method); | |
} | |
/** | |
* Dependencies should be specified in the service definition and can be | |
* then accessed in __construct(). Arguments are sent through the URL path | |
* and should match the parameters of the method you are using as your | |
* controller. | |
* | |
* @param \Symfony\Component\HttpFoundation\Request $request Symfony Request object | |
* @param mixed $controller A callable (controller class, method) | |
* @return array An array of arguments to pass to the controller | |
* @throws \phpbb\controller\exception | |
*/ | |
public function getArguments(Request $request, $controller) | |
{ | |
// At this point, $controller should be a callable | |
if (is_array($controller)) | |
{ | |
list($object, $method) = $controller; | |
$mirror = new \ReflectionMethod($object, $method); | |
} | |
else if (is_object($controller) && !$controller instanceof \Closure) | |
{ | |
$mirror = new \ReflectionObject($controller); | |
$mirror = $mirror->getMethod('__invoke'); | |
} | |
else | |
{ | |
$mirror = new \ReflectionFunction($controller); | |
} | |
$arguments = array(); | |
$parameters = $mirror->getParameters(); | |
$attributes = $request->attributes->all(); | |
foreach ($parameters as $param) | |
{ | |
if (array_key_exists($param->name, $attributes)) | |
{ | |
if (is_string($attributes[$param->name])) | |
{ | |
$value = $attributes[$param->name]; | |
$this->type_cast_helper->set_var($value, $attributes[$param->name], 'string', true, false); | |
$arguments[] = $value; | |
} | |
else | |
{ | |
$arguments[] = $attributes[$param->name]; | |
} | |
} | |
else if ($param->getClass() && $param->getClass()->isInstance($request)) | |
{ | |
$arguments[] = $request; | |
} | |
else if ($param->isDefaultValueAvailable()) | |
{ | |
$arguments[] = $param->getDefaultValue(); | |
} | |
else | |
{ | |
throw new \phpbb\controller\exception('CONTROLLER_ARGUMENT_VALUE_MISSING', array($param->getPosition() + 1, get_class($object) . ':' . $method, $param->name)); | |
} | |
} | |
return $arguments; | |
} | |
} |