getControllerClass($request); if (!$className) { $this->missingController($request); } $reflection = new ReflectionClass($className); if ($reflection->isAbstract() || $reflection->isInterface()) { $this->missingController($request); } /** @var \Cake\Controller\Controller $controller */ $controller = $reflection->newInstance($request, $response); return $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. * @return string|null */ public function getControllerClass(ServerRequest $request) { $pluginPath = $controller = null; $namespace = 'Controller'; if ($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') ]); } }