1: <?php
2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
15: namespace Cake\Http;
16:
17: use Cake\Core\App;
18: use Cake\Routing\Exception\MissingControllerException;
19: use Cake\Utility\Inflector;
20: use ReflectionClass;
21:
22: 23: 24:
25: class ControllerFactory
26: {
27: 28: 29: 30: 31: 32: 33: 34:
35: public function create(ServerRequest $request, Response $response)
36: {
37: $className = $this->getControllerClass($request);
38: if (!$className) {
39: $this->missingController($request);
40: }
41: $reflection = new ReflectionClass($className);
42: if ($reflection->isAbstract() || $reflection->isInterface()) {
43: $this->missingController($request);
44: }
45:
46:
47: $controller = $reflection->newInstance($request, $response);
48:
49: return $controller;
50: }
51:
52: 53: 54: 55: 56: 57:
58: public function getControllerClass(ServerRequest $request)
59: {
60: $pluginPath = $controller = null;
61: $namespace = 'Controller';
62: if ($request->getParam('controller')) {
63: $controller = $request->getParam('controller');
64: }
65: if ($request->getParam('plugin')) {
66: $pluginPath = $request->getParam('plugin') . '.';
67: }
68: if ($request->getParam('prefix')) {
69: if (strpos($request->getParam('prefix'), '/') === false) {
70: $namespace .= '/' . Inflector::camelize($request->getParam('prefix'));
71: } else {
72: $prefixes = array_map(
73: 'Cake\Utility\Inflector::camelize',
74: explode('/', $request->getParam('prefix'))
75: );
76: $namespace .= '/' . implode('/', $prefixes);
77: }
78: }
79: $firstChar = substr($controller, 0, 1);
80:
81:
82:
83:
84: if (strpos($controller, '\\') !== false ||
85: strpos($controller, '/') !== false ||
86: strpos($controller, '.') !== false ||
87: $firstChar === strtolower($firstChar)
88: ) {
89: $this->missingController($request);
90: }
91:
92: return App::className($pluginPath . $controller, $namespace, 'Controller') ?: null;
93: }
94:
95: 96: 97: 98: 99: 100: 101:
102: protected function missingController($request)
103: {
104: throw new MissingControllerException([
105: 'class' => $request->getParam('controller'),
106: 'plugin' => $request->getParam('plugin'),
107: 'prefix' => $request->getParam('prefix'),
108: '_ext' => $request->getParam('_ext')
109: ]);
110: }
111: }
112: