Completed
Push — master ( 342308...8d5b1d )
by Jean-Christophe
01:52
created

Startup::runAction()   C

Complexity

Conditions 7
Paths 13

Size

Total Lines 23
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 23
rs 6.7272
c 0
b 0
f 0
cc 7
eloc 16
nc 13
nop 3
1
<?php
2
namespace micro\controllers;
3
use micro\orm\DAO;
4
use micro\utils\StrUtils;
5
use micro\views\engine\TemplateEngine;
6
7
class Startup{
8
	public static $urlParts;
9
	private static $config;
10
11
	public static function run(array &$config,$url){
12
		@set_exception_handler(array('Startup', 'errorHandler'));
1 ignored issue
show
Security Best Practice introduced by
It seems like you do not handle an error condition here. This can introduce security issues, and is generally not recommended.

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
13
		self::$config=$config;
14
		self::startTemplateEngine($config);
15
		session_start();
16
17
		if($config["test"]){
18
			\micro\log\Logger::init();
19
			$config["siteUrl"]="http://127.0.0.1:8090/";
20
		}
21
22
		$db=$config["database"];
23
		if($db["dbName"]!=="")
24
			DAO::connect($db["dbName"],@$db["serverName"],@$db["port"],@$db["user"],@$db["password"]);
25
26
		$u=self::parseUrl($config, $url);
27
28
		if(class_exists($u[0]) && StrUtils::startswith($u[0],"_")===false){
29
			//Construction de l'instance de la classe (1er élément du tableau)
30
			try{
31
				if(isset($config['onStartup'])){
32
					if(is_callable($config['onStartup'])){
33
						$config["onStartup"]($u);
34
					}
35
				}
36
				self::runAction($u);
37
			}catch (\Exception $e){
38
				print "Error!: " . $e->getMessage() . "<br/>";
39
			}
40
		}else{
41
			print "Le contrôleur `".$u[0]."` n'existe pas <br/>";
42
		}
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
					$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
		$controller=new $u[0]();
76
		if(!$controller instanceof Controller){
77
			print "`{$u[0]}` n'est pas une instance de contrôleur.`<br/>";
78
			return;
79
		}
80
		$config=self::getConfig();
81
		//Dependency injection
82
		if(\array_key_exists("di", $config)){
83
			$di=$config["di"];
84
			if(\is_array($di)){
85
				foreach ($di as $k=>$v){
86
					$controller->$k=$v();
87
				}
88
			}
89
		}
90
91
		if($initialize)
92
			$controller->initialize();
93
		self::CallController($controller,$u);
94
		if($finalize)
95
			$controller->finalize();
96
	}
97
98
	private static function CallController(Controller $controller,$u){
99
		$urlSize=sizeof($u);
100
		try{
101
			switch ($urlSize) {
102
				case 1:
103
					$controller->index();
104
					break;
105
				case 2:
106
					$action=$u[1];
107
					//Appel de la méthode (2ème élément du tableau)
108
					if(method_exists($controller, $action)){
109
						$controller->$action();
110
					}else{
111
						print "La méthode `{$action}` n'existe pas sur le contrôleur `".$u[0]."`<br/>";
112
					}
113
					break;
114
				default:
115
					//Appel de la méthode en lui passant en paramètre le reste du tableau
116
					\call_user_func_array(array($controller,$u[1]), array_slice($u, 2));
117
					break;
118
			}
119
		}catch (\Exception $e){
120
			print "Error!: " . $e->getMessage() . "<br/>";
121
		}
122
	}
123
124
	public static function getConfig(){
125
		return self::$config;
126
	}
127
128
	public static function errorHandler($severity, $message, $filename, $lineno) {
129
		if (error_reporting() == 0) {
130
			return;
131
		}
132
		if (error_reporting() & $severity) {
133
			throw new \ErrorException($message, 0, $severity, $filename, $lineno);
134
		}
135
	}
136
}
137