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