Browse Source

Camelize route prefix when trying to load controller.

Fixes #8134
ADmad 10 years ago
parent
commit
a0fba74e1f

+ 10 - 1
src/Routing/Filter/ControllerFactoryFilter.php

@@ -17,6 +17,7 @@ namespace Cake\Routing\Filter;
 use Cake\Core\App;
 use Cake\Event\Event;
 use Cake\Routing\DispatcherFilter;
+use Cake\Utility\Inflector;
 use ReflectionClass;
 
 /**
@@ -68,7 +69,15 @@ class ControllerFactoryFilter extends DispatcherFilter
             $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 ||

+ 52 - 0
tests/TestCase/Routing/Filter/ControllerFactoryFilterTest.php

@@ -0,0 +1,52 @@
+<?php
+/**
+ * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
+ * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
+ *
+ * Licensed under The MIT License
+ * For full copyright and license information, please see the LICENSE.txt
+ * Redistributions of files must retain the above copyright notice.
+ *
+ * @copyright     Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
+ * @link          http://cakephp.org CakePHP(tm) Project
+ * @since         3.2.1
+ * @license       http://www.opensource.org/licenses/mit-license.php MIT License
+ */
+namespace Cake\Test\TestCase\Routing\Filter;
+
+use Cake\Core\Configure;
+use Cake\Event\Event;
+use Cake\Network\Request;
+use Cake\Network\Response;
+use Cake\Routing\Filter\ControllerFactoryFilter;
+use Cake\TestSuite\TestCase;
+
+/**
+ * Controller factory filter test.
+ */
+class ControllerFactoryFilterTest extends TestCase
+{
+
+    /**
+     * testBeforeDispatch
+     *
+     * @return void
+     */
+    public function testBeforeDispatch()
+    {
+        Configure::write('App.namespace', 'TestApp');
+
+        $filter = new ControllerFactoryFilter();
+
+        $request = new Request();
+        $response = new Response();
+        $request->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'])
+        );
+    }
+}