Completed
Push — master ( 1fdf8c...1603d3 )
by Jean-Christophe
02:05
created

Startup::onStartupAndRun()   A

Complexity

Conditions 3
Paths 5

Size

Total Lines 9
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 9
rs 9.6666
cc 3
eloc 7
nc 5
nop 2
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($config, $url);
19
20
		if(($ru=Router::getRoute($url))!==false){
21
			self::onStartupAndRun($ru,true);
22
		}else{
23
			self::setCtrlNS($config);
24
			if(class_exists(self::$ctrlNS.$u[0]) && StrUtils::startswith($u[0],"_")===false){
25
				self::onStartupAndRun($u);
26
			}else{
27
				print "Le contrôleur `".self::$ctrlNS.$u[0]."` n'existe pas <br/>";
28
			}
29
		}
30
	}
31
32
	private static function onStartupAndRun($urlParts,$hasctrlNS=false){
33
		try{
34
			if(!$hasctrlNS)
35
				$urlParts[0]=self::$ctrlNS.$urlParts[0];
36
			self::runAction($urlParts);
37
		}catch (\Exception $e){
38
			print "Error!: " . $e->getMessage() . "<br/>";
39
		}
40
	}
41
42
	private static function setCtrlNS($config){
43
		$ns=$config["mvcNS"]["controllers"];
44
		if($ns!=="" && $ns!==null){
45
			$ns.="\\";
46
		}
47
		self::$ctrlNS=$ns;
48
	}
49
50
	private static function parseUrl($config,&$url){
0 ignored issues
show
Unused Code introduced by
The parameter $config is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
51
		if(!$url){
52
			$url="_default";
53
		}
54 View Code Duplication
		if(StrUtils::endswith($url, "/"))
55
			$url=substr($url, 0,strlen($url)-1);
56
		self::$urlParts=explode("/", $url);
57
58
		return self::$urlParts;
59
	}
60
61
	private static function startTemplateEngine($config){
62
		try {
63
			$engineOptions=array('cache' => ROOT.DS."views/cache/");
64
			if(isset($config["templateEngine"])){
65
				$templateEngine=$config["templateEngine"];
66
				if(isset($config["templateEngineOptions"])){
67
					$engineOptions=$config["templateEngineOptions"];
68
				}
69
				$engine=new $templateEngine($engineOptions);
70
				if ($engine instanceof TemplateEngine){
71
					self::$config["templateEngine"]=$engine;
72
				}
73
			}
74
		} catch (\Exception $e) {
75
			echo $e->getTraceAsString();
76
		}
77
	}
78
79
	public static function runAction($u,$initialize=true,$finalize=true){
80
		$config=self::getConfig();
81
		$ctrl=$u[0];
82
		$controller=new $ctrl();
83
		if(!$controller instanceof Controller){
84
			print "`{$u[0]}` n'est pas une instance de contrôleur.`<br/>";
85
			return;
86
		}
87
		//Dependency injection
88
		if(\array_key_exists("di", $config)){
89
			$di=$config["di"];
90
			if(\is_array($di)){
91
				foreach ($di as $k=>$v){
92
					$controller->$k=$v();
93
				}
94
			}
95
		}
96
97
		if($initialize)
98
			$controller->initialize();
99
		self::callController($controller,$u);
100
		if($finalize)
101
			$controller->finalize();
102
	}
103
104
	private static function callController(Controller $controller,$u){
105
		$urlSize=sizeof($u);
106
		try{
107
			switch ($urlSize) {
108
				case 1:
109
					$controller->index();
110
					break;
111
				case 2:
112
					$action=$u[1];
113
					//Appel de la méthode (2ème élément du tableau)
114
					if(method_exists($controller, $action)){
115
						$controller->$action();
116
					}else{
117
						print "La méthode `{$action}` n'existe pas sur le contrôleur `".$u[0]."`<br/>";
118
					}
119
					break;
120
				default:
121
					//Appel de la méthode en lui passant en paramètre le reste du tableau
122
					\call_user_func_array(array($controller,$u[1]), array_slice($u, 2));
123
					break;
124
			}
125
		}catch (\Exception $e){
126
			print "Error!: " . $e->getMessage() . "<br/>";
127
		}
128
	}
129
130
	public static function getConfig(){
131
		return self::$config;
132
	}
133
134
	public static function errorHandler($severity, $message, $filename, $lineno) {
135
		if (error_reporting() == 0) {
136
			return;
137
		}
138
		if (error_reporting() & $severity) {
139
			throw new \ErrorException($message, 0, $severity, $filename, $lineno);
140
		}
141
	}
142
}
143