Completed
Push — master ( efe804...2e47cd )
by Jean-Christophe
02:01
created

Startup::getConfig()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 3
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 0
1
<?php
2
namespace micro\controllers;
3
use micro\orm\DAO;
4
use micro\utils\StrUtils;
5
use micro\views\engine\TemplateEngine;
6
use mindplay\annotations\Annotations;
7
use mindplay\annotations\AnnotationCache;
8
use mindplay\annotations\AnnotationManager;
9
use micro\orm\OrmUtils;
10
11
class Startup{
12
	public static $urlParts;
13
	private static $config;
14
	private static $ctrlNS;
15
16
	public static function run(array &$config,$url){
17
		@set_exception_handler(array('Startup', 'errorHandler'));
18
		self::$config=$config;
19
		self::startTemplateEngine($config);
20
21
		if($config["test"]){
22
			\micro\log\Logger::init();
23
			$config["siteUrl"]="http://127.0.0.1:8090/";
24
		}
25
26
		$db=$config["database"];
27
		if($db["dbName"]!==""){
28
			DAO::connect($db["dbName"],@$db["serverName"],@$db["port"],@$db["user"],@$db["password"]);
29
			self::startOrm($config);
30
		}
31
		session_start();
32
33
		$u=self::parseUrl($config, $url);
34
		self::setCtrlNS($config);
35
		if(class_exists(self::$ctrlNS.$u[0]) && StrUtils::startswith($u[0],"_")===false){
36
			//Construction de l'instance de la classe (1er élément du tableau)
37
			try{
38
				if(isset($config['onStartup'])){
39
					if(is_callable($config['onStartup'])){
40
						$config["onStartup"]($u);
41
					}
42
				}
43
				self::runAction($u);
44
			}catch (\Exception $e){
45
				print "Error!: " . $e->getMessage() . "<br/>";
46
			}
47
		}else{
48
			print "Le contrôleur `".$config["controllerNS"].$u[0]."` n'existe pas <br/>";
49
		}
50
	}
51
52
	private static function setCtrlNS($config){
53
		$ns=$config["mvcNS"]["controllers"];
54
		if($ns!=="" && $ns!==null){
55
			$ns.="\\";
56
		}
57
		self::$ctrlNS=$ns;
58
	}
59
60
	public static function getCacheDirectory($config){
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...
61
		$config=self::$config;
62
		$cacheDirectory=@$config["ormCache"]["cacheDirectory"];
63
		if(!isset($cacheDirectory)){
64
			self::$config["ormCache"]=["cacheDirectory"=>"models/cache/"];
65
			$cacheDirectory=self::$config["ormCache"]["cacheDirectory"];
66
		}
67
		return $cacheDirectory;
68
	}
69
70
	private static function startOrm($config){
71
		$cacheDirectory=ROOT.DS.self::getCacheDirectory($config);
72
		Annotations::$config['cache'] = new AnnotationCache($cacheDirectory.'/annotations');
73
		self::register(Annotations::getManager());
74
		OrmUtils::$ormCache=new AnnotationCache($cacheDirectory);
75
	}
76
77
	private static function register(AnnotationManager $annotationManager){
78
		$annotationManager->registry=array_merge($annotationManager->registry,[
79
				'id' => 'micro\annotations\IdAnnotation',
80
				'manyToOne' => 'micro\annotations\ManyToOneAnnotation',
81
				'oneToMany' => 'micro\annotations\OneToManyAnnotation',
82
				'manyToMany' => 'micro\annotations\ManyToManyAnnotation',
83
				'joinColumn' => 'micro\annotations\JoinColumnAnnotation',
84
				'table' => 'micro\annotations\TableAnnotation',
85
				'transient' => 'micro\annotations\TransientAnnotation',
86
				'column' => 'micro\annotations\ColumnAnnotation',
87
				'joinTable' => 'micro\annotations\JoinTableAnnotation'
88
		]);
89
	}
90
91
	private static function parseUrl($config,$url){
92
		if(!$url){
93
			$url=$config["documentRoot"];
94
		}
95 View Code Duplication
		if(StrUtils::endswith($url, "/"))
96
			$url=substr($url, 0,strlen($url)-1);
97
		self::$urlParts=explode("/", $url);
98
99
		return self::$urlParts;
100
	}
101
102
	private static function startTemplateEngine($config){
103
		try {
104
			$engineOptions=array('cache' => ROOT.DS."views/cache/");
105
			if(isset($config["templateEngine"])){
106
				$templateEngine=$config["templateEngine"];
107
				if(isset($config["templateEngineOptions"])){
108
					$engineOptions=$config["templateEngineOptions"];
109
				}
110
				$engine=new $templateEngine($engineOptions);
111
				if ($engine instanceof TemplateEngine){
112
					self::$config["templateEngine"]=$engine;
113
				}
114
			}
115
		} catch (\Exception $e) {
116
			echo $e->getTraceAsString();
117
		}
118
	}
119
120
	public static function runAction($u,$initialize=true,$finalize=true){
121
		$config=self::getConfig();
122
		$ctrl=self::$ctrlNS.$u[0];
123
		$controller=new $ctrl();
124
		if(!$controller instanceof Controller){
125
			print "`{$u[0]}` n'est pas une instance de contrôleur.`<br/>";
126
			return;
127
		}
128
		//Dependency injection
129
		if(\array_key_exists("di", $config)){
130
			$di=$config["di"];
131
			if(\is_array($di)){
132
				foreach ($di as $k=>$v){
133
					$controller->$k=$v();
134
				}
135
			}
136
		}
137
138
		if($initialize)
139
			$controller->initialize();
140
		self::callController($controller,$u);
141
		if($finalize)
142
			$controller->finalize();
143
	}
144
145
	private static function callController(Controller $controller,$u){
146
		$urlSize=sizeof($u);
147
		try{
148
			switch ($urlSize) {
149
				case 1:
150
					$controller->index();
151
					break;
152
				case 2:
153
					$action=$u[1];
154
					//Appel de la méthode (2ème élément du tableau)
155
					if(method_exists($controller, $action)){
156
						$controller->$action();
157
					}else{
158
						print "La méthode `{$action}` n'existe pas sur le contrôleur `".$u[0]."`<br/>";
159
					}
160
					break;
161
				default:
162
					//Appel de la méthode en lui passant en paramètre le reste du tableau
163
					\call_user_func_array(array($controller,$u[1]), array_slice($u, 2));
164
					break;
165
			}
166
		}catch (\Exception $e){
167
			print "Error!: " . $e->getMessage() . "<br/>";
168
		}
169
	}
170
171
	public static function getConfig(){
172
		return self::$config;
173
	}
174
175
	public static function errorHandler($severity, $message, $filename, $lineno) {
176
		if (error_reporting() == 0) {
177
			return;
178
		}
179
		if (error_reporting() & $severity) {
180
			throw new \ErrorException($message, 0, $severity, $filename, $lineno);
181
		}
182
	}
183
}
184