Passed
Push — master ( b9acc3...1dafdc )
by Jean-Christophe
03:25
created

ControllerParser::createRouteMethod()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 3
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 2

Importance

Changes 0
Metric Value
eloc 2
dl 0
loc 3
ccs 3
cts 3
cp 1
rs 10
c 0
b 0
f 0
cc 2
nc 2
nop 10
crap 2

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

1
<?php
2
3
namespace Ubiquity\cache\parser;
4
5
use Ubiquity\orm\parser\Reflexion;
6
use Ubiquity\utils\base\UString;
7
use Ubiquity\annotations\router\RouteAnnotation;
8
use Ubiquity\cache\ClassUtils;
9
use Ubiquity\utils\base\UArray;
10
11
/**
12
 * Scans a controller to detect routes defined by annotations 
13
 * @author jcheron <[email protected]>
14
 * @version 1.0.3
15
 */
16
class ControllerParser {
17
	use ControllerParserPathTrait;
18
	
19
	private $controllerClass;
20
	private $mainRouteClass;
21
	private $routesMethods=[ ];
22
	private $rest=false;
23
	private static $excludeds=[ "__construct","isValid","initialize","finalize","onInvalidControl","loadView","forward","redirectToRoute" ];
24
25 2
	public function parse($controllerClass) {
26 2
		$automated=false;
27 2
		$inherited=false;
28 2
		$this->controllerClass=$controllerClass;
29 2
		$restAnnotsClass=[];
30 2
		$reflect=new \ReflectionClass($controllerClass);
31 2
		if (!$reflect->isAbstract() && $reflect->isSubclassOf("Ubiquity\controllers\Controller")) {
32 2
			$instance=new $controllerClass();
33
			try{
34 2
				$annotsClass=Reflexion::getAnnotationClass($controllerClass, "@route");
35 2
				$restAnnotsClass=Reflexion::getAnnotationClass($controllerClass, "@rest");
36
			}catch (\Exception $e){
37
				//When controllerClass generates an exception
38
			}
39 2
			$this->rest=\sizeof($restAnnotsClass) > 0;
40 2
			if (\sizeof($annotsClass) > 0) {
41 1
				$this->mainRouteClass=$annotsClass[0];
42 1
				$inherited=$this->mainRouteClass->inherited;
43 1
				$automated=$this->mainRouteClass->automated;
44
			}
45 2
			$methods=Reflexion::getMethods($instance, \ReflectionMethod::IS_PUBLIC);
46 2
			$this->parseMethods($methods, $controllerClass, $inherited, $automated);
47
		}
48 2
	}
49
	
50 2
	private function parseMethods($methods,$controllerClass,$inherited,$automated){
51 2
		foreach ( $methods as $method ) {
52 2
			if ($method->getDeclaringClass()->getName() === $controllerClass || $inherited) {
53
				try{
54 2
					$annots=Reflexion::getAnnotationsMethod($controllerClass, $method->name, ["@route","@get","@post"]);
55 2
					if (sizeof($annots)>0) {
56 1
						foreach ( $annots as $annot ) {
57 1
							$this->parseAnnot($annot, $method);
58
						}
59 1
						$this->routesMethods[$method->name]=[ "annotations" => $annots,"method" => $method ];
60
					} else {
61 2
						if ($automated) {
62 1
							if ($method->class !== 'Ubiquity\\controllers\\Controller' && \array_search($method->name, self::$excludeds) === false && !UString::startswith($method->name, "_"))
63 1
								$this->routesMethods[$method->name]=[ "annotations" => $this->generateRouteAnnotationFromMethod($method),"method" => $method ];
64
						}
65
					}
66
				}catch(\Exception $e){
67
					//When controllerClass generates an exception
68
				}
69
			}
70
		}
71 2
	}
72
	
73 1
	private function parseAnnot(&$annot,$method){
74 1
		if (UString::isNull($annot->path)) {
75 1
			$newAnnot=$this->generateRouteAnnotationFromMethod($method);
76 1
			$annot->path=$newAnnot[0]->path;
77
		}else{
78 1
			$annot->path=$this->parseMethodPath($method, $annot->path);
79
		}
80 1
	}
81
82 1
	private function generateRouteAnnotationFromMethod(\ReflectionMethod $method) {
83 1
		$annot=new RouteAnnotation();
84 1
		$annot->path=self::getPathFromMethod($method);
85 1
		return [ $annot ];
86
	}
87
88 2
	public function asArray($minify=false) {
89 2
		$result=[ ];
90 2
		$prefix="";
91 2
		$httpMethods=false;
92 2
		if ($this->mainRouteClass) {
93 1
			if (isset($this->mainRouteClass->path))
94 1
				$prefix=$this->mainRouteClass->path;
95 1
			if (isset($this->mainRouteClass->methods)) {
96
				$httpMethods=$this->mainRouteClass->methods;
97
				if ($httpMethods !== null) {
98
					if (\is_string($httpMethods))
99
						$httpMethods=[ $httpMethods ];
100
				}
101
			}
102
		}
103 2
		foreach ( $this->routesMethods as $method => $arrayAnnotsMethod ) {
104 1
			$routeAnnotations=$arrayAnnotsMethod["annotations"];
105
106 1
			foreach ( $routeAnnotations as $routeAnnotation ) {
107 1
				$params=[ "path" => $routeAnnotation->path,"methods" => $routeAnnotation->methods,"name" => $routeAnnotation->name,"cache" => $routeAnnotation->cache,"duration" => $routeAnnotation->duration,"requirements" => $routeAnnotation->requirements,"priority"=>$routeAnnotation->priority ];
108 1
				self::parseRouteArray($result, $this->controllerClass, $params, $arrayAnnotsMethod["method"], $method, $prefix, $httpMethods);
109
			}
110
		}
111
		uasort($result, function ($item1, $item2) {
112 1
			return UArray::getRecursive($item2,"priority",0) <=> UArray::getRecursive($item1,"priority",0);
113 2
		});
114 2
		UArray::removeRecursive($result,"priority");
115 2
		if($minify){
116
			self::minifyRoutes($result);
117
		}
118 2
		return $result;
119
	}
120
	
121
	public static function minifyRoutes(&$routes){
122
		foreach ($routes as &$route){
123
			self::minifyRoute($route);
124
		}
125
	}
126
	
127
	private static function minifyRoute(&$route){
128
		if(isset($route['name']) && !is_string($route['name'])){
129
			unset($route['name']);
130
		}
131
		if(isset($route['parameters']) && sizeof($route['parameters'])==0){
132
			unset($route['parameters']);
133
		}
134
		if((isset($route['cache']) && $route['cache']==false) || (array_key_exists('cache', $route) && $route['cache']==null)){
135
			unset($route['cache']);
136
			unset($route['duration']);
137
		}
138
		if((isset($route['duration']) && !is_numeric($route['duration'])) || (array_key_exists('duration', $route) && $route['duration']==null)){
139
			unset($route['duration']);
140
		}
141
		if(isset($route['priority'])){
142
			unset($route['priority']);
143
		}
144
	}
145
146 11
	public static function parseRouteArray(&$result, $controllerClass, $routeArray, \ReflectionMethod $method, $methodName, $prefix="", $httpMethods=NULL) {
147 11
		if (!isset($routeArray["path"])) {
148
			$routeArray["path"]=self::getPathFromMethod($method);
149
		}
150 11
		$pathParameters=self::addParamsPath($routeArray["path"], $method, $routeArray["requirements"]);
151 11
		$name=$routeArray["name"];
152 11
		if (!isset($name)) {
153 1
			$name=UString::cleanAttribute(ClassUtils::getClassSimpleName($controllerClass) . "_" . $methodName);
154
		}
155 11
		$cache=$routeArray["cache"];
156 11
		$duration=$routeArray["duration"];
157 11
		$path=$pathParameters["path"];
158 11
		$parameters=$pathParameters["parameters"];
159 11
		$priority=$routeArray["priority"];
160 11
		$path=self::cleanpath($prefix, $path);
161 11
		if (isset($routeArray["methods"]) && \is_array($routeArray["methods"])) {
162 1
			self::createRouteMethod($result, $controllerClass, $path, $routeArray["methods"], $methodName, $parameters, $name, $cache, $duration,$priority);
163 11
		} elseif (\is_array($httpMethods)) {
164
			self::createRouteMethod($result, $controllerClass, $path, $httpMethods, $methodName, $parameters, $name, $cache, $duration,$priority);
165
		} else {
166 11
			$result[$path]=[ "controller" => $controllerClass,"action" => $methodName,"parameters" => $parameters,"name" => $name,"cache" => $cache,"duration" => $duration,"priority"=>$priority];
167
		}
168 11
	}
169
170 1
	private static function createRouteMethod(&$result, $controllerClass, $path, $httpMethods, $method, $parameters, $name, $cache, $duration,$priority) {
171 1
		foreach ( $httpMethods as $httpMethod ) {
172 1
			$result[$path][$httpMethod]=[ "controller" => $controllerClass,"action" => $method,"parameters" => $parameters,"name" => $name,"cache" => $cache,"duration" => $duration,"priority"=>$priority ];
173
		}
174 1
	}
175
176 2
	public function isRest() {
177 2
		return $this->rest;
178
	}
179
}
180