Browse Source

extract controller name logic into another method

Jorge González 9 years ago
parent
commit
66e0b1a37c
2 changed files with 50 additions and 14 deletions
  1. 31 14
      src/Http/ControllerFactory.php
  2. 19 0
      tests/TestCase/Http/ControllerFactoryTest.php

+ 31 - 14
src/Http/ControllerFactory.php

@@ -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'));
@@ -65,16 +91,7 @@ class ControllerFactory
             $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');
     }
 
     /**

+ 19 - 0
tests/TestCase/Http/ControllerFactoryTest.php

@@ -263,4 +263,23 @@ class ControllerFactoryTest extends TestCase
         ]);
         $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);
+    }
 }