Completed
Push — master ( 5b920c...b19ccf )
by Jean-Christophe
02:01
created

Startup::setCtrlNS()   A

Complexity

Conditions 3
Paths 2

Size

Total Lines 7
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 7
rs 9.4285
c 0
b 0
f 0
cc 3
eloc 5
nc 2
nop 1
1
<?php
2
namespace micro\controllers;
3
use micro\utils\StrUtils;
4
use micro\views\engine\TemplateEngine;
5
6
class Startup{
7
	public static $urlParts;
8
	private static $config;
9
	private static $ctrlNS;
10
11
	public static function run(array &$config,$url){
12
		@set_exception_handler(array('Startup', 'errorHandler'));
13
		self::$config=$config;
14
		self::startTemplateEngine($config);
15
16
		session_start();
17
18
		$u=self::parseUrl($url);
19
20
		if(($ru=Router::getRoute($url))!==false){
21
			self::runAction($ru);
22
		}else{
23
			self::setCtrlNS($config);
24
			$u[0]=self::$ctrlNS.$u[0];
25
			if(class_exists($u[0])){
26
				self::runAction($u);
27
			}else{
28
				print "Le contrôleur `".$u[0]."` n'existe pas <br/>";
29
			}
30
		}
31
	}
32
33
	private static function setCtrlNS($config){
34
		$ns=$config["mvcNS"]["controllers"];
35
		if($ns!=="" && $ns!==null){
36
			$ns.="\\";
37
		}
38
		self::$ctrlNS=$ns;
39
	}
40
41
	private static function parseUrl(&$url){
42
		if(!$url){
43
			$url="_default";
44
		}
45 View Code Duplication
		if(StrUtils::endswith($url, "/"))
46
			$url=substr($url, 0,strlen($url)-1);
47
		self::$urlParts=explode("/", $url);
48
49
		return self::$urlParts;
50
	}
51
52
	private static function startTemplateEngine($config){
53
		try {
54
			$engineOptions=array('cache' => ROOT.DS."views/cache/");
55
			if(isset($config["templateEngine"])){
56
				$templateEngine=$config["templateEngine"];
57
				if(isset($config["templateEngineOptions"])){
58
					$engineOptions=$config["templateEngineOptions"];
59
				}
60
				$engine=new $templateEngine($engineOptions);
61
				if ($engine instanceof TemplateEngine){
62
					self::$config["templateEngine"]=$engine;
63
				}
64
			}
65
		} catch (\Exception $e) {
66
			echo $e->getTraceAsString();
67
		}
68
	}
69
70
	public static function runAction($u,$initialize=true,$finalize=true){
71
		$config=self::getConfig();
72
		$ctrl=$u[0];
73
		$controller=new $ctrl();
74
		if(!$controller instanceof Controller){
75
			print "`{$u[0]}` n'est pas une instance de contrôleur.`<br/>";
76
			return;
77
		}
78
		//Dependency injection
79
		if(\array_key_exists("di", $config)){
80
			$di=$config["di"];
81
			if(\is_array($di)){
82
				foreach ($di as $k=>$v){
83
					$controller->$k=$v();
84
				}
85
			}
86
		}
87
88
		if($initialize)
89
			$controller->initialize();
90
		self::callController($controller,$u);
91
		if($finalize)
92
			$controller->finalize();
93
	}
94
95
	private static function callController(Controller $controller,$u){
96
		$urlSize=sizeof($u);
97
		try{
98
			switch ($urlSize) {
99
				case 1:
100
					$controller->index();
101
					break;
102
				case 2:
103
					$action=$u[1];
104
					//Appel de la méthode (2ème élément du tableau)
105
					if(method_exists($controller, $action)){
106
						$controller->$action();
107
					}else{
108
						print "La méthode `{$action}` n'existe pas sur le contrôleur `".$u[0]."`<br/>";
109
					}
110
					break;
111
				default:
112
					//Appel de la méthode en lui passant en paramètre le reste du tableau
113
					\call_user_func_array(array($controller,$u[1]), array_slice($u, 2));
114
					break;
115
			}
116
		}catch (\Exception $e){
117
			print "Error!: " . $e->getMessage() . "<br/>";
118
		}
119
	}
120
121
	public static function getConfig(){
122
		return self::$config;
123
	}
124
125
	public static function errorHandler($severity, $message, $filename, $lineno) {
126
		if (error_reporting() == 0) {
127
			return;
128
		}
129
		if (error_reporting() & $severity) {
130
			throw new \ErrorException($message, 0, $severity, $filename, $lineno);
131
		}
132
	}
133
}
134