Completed
Push — master ( 222324...5a2375 )
by Jean-Christophe
01:57
created

Startup::startTemplateEngine()   B

Complexity

Conditions 5
Paths 11

Size

Total Lines 17
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

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