params['plugin'])) { $pluginPath = $request->params['plugin'] . '.'; } if (isset($request->params['controller'])) { $controller = $request->params['controller']; } if (isset($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); // 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) ) { return $this->missingController($request); } $className = App::classname($pluginPath . $controller, $namespace, 'Controller'); if (!$className) { return $this->missingController($request); } $reflection = new ReflectionClass($className); if ($reflection->isAbstract() || $reflection->isInterface()) { return $this->missingController($request); } return $reflection->newInstance($request, $response, $controller); } /** * Throws an exception when a controller is missing. * * @param \Cake\Network\Request $request The request. * @throws \Cake\Routing\Exception\MissingControllerException * @return void */ protected function missingController($request) { throw new MissingControllerException([ 'class' => $request->param('controller'), 'plugin' => $request->param('plugin'), 'prefix' => $request->param('prefix'), '_ext' => $request->param('_ext') ]); } }