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|null $controllerName The controller name present in the request params * @return string|null */ 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('prefix')) { if (strpos($request->getParam('prefix'), '/') === false) { $namespace .= '/' . Inflector::camelize($request->getParam('prefix')); } else { $prefixes = array_map( 'Cake\Utility\Inflector::camelize', explode('/', $request->getParam('prefix')) ); $namespace .= '/' . implode('/', $prefixes); } } $firstChar = substr($controller, 0, 1); // Disallow plugin short forms, / and \\ from // controller names as they allow direct references to // be created. if (strpos($controller, '\\') !== false || strpos($controller, '/') !== false || strpos($controller, '.') !== false || $firstChar === strtolower($firstChar) ) { $this->missingController($request); } return App::className($pluginPath . $controller, $namespace, 'Controller') ?: null; } /** * Throws an exception when a controller is missing. * * @param \Cake\Http\ServerRequest $request The request. * @throws \Cake\Routing\Exception\MissingControllerException * @return void */ protected function missingController($request) { throw new MissingControllerException([ 'class' => $request->getParam('controller'), 'plugin' => $request->getParam('plugin'), 'prefix' => $request->getParam('prefix'), '_ext' => $request->getParam('_ext') ]); } }