Skip to content

Commit

Permalink
extract controller name logic into another method
Browse files Browse the repository at this point in the history
  • Loading branch information
steinkel committed Apr 18, 2017
1 parent 60142f3 commit 66e0b1a
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 14 deletions.
45 changes: 31 additions & 14 deletions src/Http/ControllerFactory.php
Expand Up @@ -33,14 +33,40 @@ class ControllerFactory
*/
public function create(ServerRequest $request, Response $response)
{
$pluginPath = $controller = null;
$controller = null;
if ($request->getParam('controller')) {
$controller = $request->getParam('controller');
}
$className = $this->getControllerClass($request, $controller);
if (!$className) {
$this->missingController($request);
}
$reflection = new ReflectionClass($className);
if ($reflection->isAbstract() || $reflection->isInterface()) {
$this->missingController($request);
}

return $reflection->newInstance($request, $response, $controller);
}

/**
* Determine the controller class name based on current request and controller param
*
* @param \Cake\Http\ServerRequest $request The request to build a controller for.
* @param string $controllerName The controller name present in the request params
* @return bool|string
*/
public function getControllerClass(ServerRequest $request, $controllerName = null)
{
$pluginPath = null;
$controller = $controllerName;
$namespace = 'Controller';
if (!$controller && $request->getParam('controller')) {
$controller = $request->getParam('controller');
}
if ($request->getParam('plugin')) {
$pluginPath = $request->getParam('plugin') . '.';
}
if ($request->getParam('controller')) {
$controller = $request->getParam('controller');
}
if ($request->getParam('prefix')) {
if (strpos($request->getParam('prefix'), '/') === false) {
$namespace .= '/' . Inflector::camelize($request->getParam('prefix'));
Expand All @@ -65,16 +91,7 @@ public function create(ServerRequest $request, Response $response)
$this->missingController($request);
}

$className = App::className($pluginPath . $controller, $namespace, 'Controller');
if (!$className) {
$this->missingController($request);
}
$reflection = new ReflectionClass($className);
if ($reflection->isAbstract() || $reflection->isInterface()) {
$this->missingController($request);
}

return $reflection->newInstance($request, $response, $controller);
return App::className($pluginPath . $controller, $namespace, 'Controller');
}

/**
Expand Down
19 changes: 19 additions & 0 deletions tests/TestCase/Http/ControllerFactoryTest.php
Expand Up @@ -263,4 +263,23 @@ public function testAbsoluteReferenceFailure()
]);
$this->factory->create($request, $this->response);
}

/**
* Test building controller name passing no controller name
*
* @return void
*/
public function testGetControllerClassNoControllerName()
{
$request = new ServerRequest([
'url' => 'test_plugin_three/ovens/index',
'params' => [
'plugin' => 'Company/TestPluginThree',
'controller' => 'Ovens',
'action' => 'index',
]
]);
$result = $this->factory->getControllerClass($request);
$this->assertSame('Company\TestPluginThree\Controller\OvensController', $result);
}
}

0 comments on commit 66e0b1a

Please sign in to comment.