From 954c6fdbce58c5ef71dd6b0cbb9cdd3036c6d57c Mon Sep 17 00:00:00 2001 From: ADmad Date: Sun, 31 Jan 2016 00:21:19 +0530 Subject: [PATCH] Camelize route prefix when trying to load controller. Fixes #8134 --- .../Filter/ControllerFactoryFilter.php | 11 +++- .../Filter/ControllerFactoryFilterTest.php | 52 +++++++++++++++++++ 2 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 tests/TestCase/Routing/Filter/ControllerFactoryFilterTest.php diff --git a/src/Routing/Filter/ControllerFactoryFilter.php b/src/Routing/Filter/ControllerFactoryFilter.php index f31f56d3e49..c2389cc6eb2 100644 --- a/src/Routing/Filter/ControllerFactoryFilter.php +++ b/src/Routing/Filter/ControllerFactoryFilter.php @@ -17,6 +17,7 @@ use Cake\Core\App; use Cake\Event\Event; use Cake\Routing\DispatcherFilter; +use Cake\Utility\Inflector; use ReflectionClass; /** @@ -68,7 +69,15 @@ protected function _getController($request, $response) $controller = $request->params['controller']; } if (!empty($request->params['prefix'])) { - $namespace .= '/' . $request->params['prefix']; + if (strpos('/', $request->params['prefix']) === false) { + $namespace .= '/' . Inflector::camelize($request->params['prefix']); + } else { + $prefixes = array_map( + 'Cake\Utility\Inflector::camelize', + explode('/', $request->params['prefix']) + ); + $namespace .= '/' . implode('/', $prefixes); + } } $firstChar = substr($controller, 0, 1); if (strpos($controller, '\\') !== false || diff --git a/tests/TestCase/Routing/Filter/ControllerFactoryFilterTest.php b/tests/TestCase/Routing/Filter/ControllerFactoryFilterTest.php new file mode 100644 index 00000000000..f9e67fd46da --- /dev/null +++ b/tests/TestCase/Routing/Filter/ControllerFactoryFilterTest.php @@ -0,0 +1,52 @@ +addParams(['prefix' => 'admin', 'controller' => 'Posts', 'action' => 'index']); + $event = new Event(__CLASS__, $this, compact('request', 'response')); + $filter->beforeDispatch($event); + + $this->assertEquals( + 'TestApp\Controller\Admin\PostsController', + get_class($event->data['controller']) + ); + } +}