SHOW:
|
|
- or go back to the newest paste.
1 | <?php | |
2 | /** | |
3 | * Bootstrap for serving all common framework functionality. | |
4 | * | |
5 | * @package system | |
6 | * @author Michael Beers <[email protected]> | |
7 | * @copyright (c) 2012, Michael Beers | Online Media en Design | |
8 | */ | |
9 | ||
10 | //Set the namespace | |
11 | namespace PhpBakery; | |
12 | ||
13 | /** | |
14 | * Bootstrap for serving all common framework functionality. | |
15 | * | |
16 | * Note: Do not use this class directly. Instead use its child class {@link PhpBakery} | |
17 | * where you can customize all methods. | |
18 | * | |
19 | - | * @todo docblocks |
19 | + | |
20 | - | * @todo throw exceptions |
20 | + | |
21 | - | * @todo create functions |
21 | + | |
22 | * @todo logger methods | |
23 | */ | |
24 | class Bootstrap | |
25 | { | |
26 | - | public $coreClassMap = array(); |
26 | + | /** |
27 | * Class map used to load all framework functionalities very fast. | |
28 | - | public $classMap = array(); |
28 | + | * |
29 | * Format: Class name => File path | |
30 | - | public $aliases = array(); |
30 | + | * |
31 | * @var array | |
32 | - | public $resources = array(); |
32 | + | */ |
33 | public static $coreClassMap = array( | |
34 | - | public $paths = array(); |
34 | + | 'PhpBakery\Exception' => 'Exception.php', |
35 | 'PhpBakery\Web' => 'Web.php', | |
36 | - | private $_enableIncludePaths = TRUE; |
36 | + | ); |
37 | ||
38 | - | private $_app; |
38 | + | /** |
39 | * Class map used to load other functionalities very fast. | |
40 | - | private $_logger; |
40 | + | * |
41 | * Format: Class name => File path | |
42 | * | |
43 | * @var array | |
44 | */ | |
45 | public static $classMap = array(); | |
46 | ||
47 | /** | |
48 | - | $this->aliases['system'] = SYS_PATH; |
48 | + | * Alias paths used to shorten all paths. |
49 | * | |
50 | * Format: Alias => Path | |
51 | * | |
52 | * @var array | |
53 | */ | |
54 | - | public function runWebApplication($params = NULL) |
54 | + | public static $aliases = array(); |
55 | ||
56 | - | return $this->registerApplication('PhpBakery\Web', $params); |
56 | + | /** |
57 | * Class map used to check what resources are already loaded. | |
58 | * | |
59 | - | public function runConsoleApplication($params = NULL) |
59 | + | * @var array |
60 | */ | |
61 | - | return $this->registerApplication('PhpBakery\Console', $params); |
61 | + | public static $resources = array(); |
62 | ||
63 | /** | |
64 | - | public function app() |
64 | + | * Include paths to search in for files |
65 | * | |
66 | - | return $this->getApplication(); |
66 | + | * @var array |
67 | */ | |
68 | public static $paths = array(); | |
69 | ||
70 | /** | |
71 | * Whether to rely on the PHP include paths at the autoloader. | |
72 | - | public function registerApplication($className, $params = NULL) |
72 | + | * |
73 | * Note: You may set this to false if your hosting environment does not support this. | |
74 | * | |
75 | * @var boolean | |
76 | */ | |
77 | - | public function getApplication() |
77 | + | private static $_enableIncludePaths = TRUE; |
78 | ||
79 | - | return $this->_app; |
79 | + | /** |
80 | * Instance of the registered application. | |
81 | * | |
82 | - | public function setApplication($obj) |
82 | + | * @var object |
83 | */ | |
84 | - | if ($this->_app === NULL || $obj === NULL) |
84 | + | private static $_app; |
85 | ||
86 | - | $this->_app = $obj; |
86 | + | /** |
87 | * Instance of the registered logger. | |
88 | * | |
89 | * @var object | |
90 | */ | |
91 | private static $_logger; | |
92 | ||
93 | /* Constructor and class helpers. | |
94 | ===================================================== */ | |
95 | ||
96 | /** | |
97 | - | public function registerAutoloader($callback, $append = FALSE) |
97 | + | * Constructor. |
98 | */ | |
99 | public function __construct() | |
100 | { | |
101 | - | $this->_enableIncludePaths = FALSE; |
101 | + | |
102 | self::$aliases['system'] = SYS_PATH; | |
103 | ||
104 | //Register the autoloader | |
105 | spl_autoload_register( array($this, 'autoloader') ); | |
106 | } | |
107 | ||
108 | /** | |
109 | * Creates a web-based application instance. | |
110 | * | |
111 | * Note: This is a function shortner for registerApplication(). | |
112 | - | public function autoloader($className) |
112 | + | * |
113 | * @param mixed $params Application configurations. | |
114 | - | if (isset($this->coreClassMap[$className])) |
114 | + | * @return object |
115 | */ | |
116 | public static function runWebApplication($params = NULL) | |
117 | - | include(SYS_PATH . $this->coreClassMap[$className]); |
117 | + | |
118 | return self::registerApplication('PhpBakery\Web', $params); | |
119 | - | else if (isset($this->classMap[$className])) |
119 | + | |
120 | ||
121 | /** | |
122 | - | include($this->classMap[$className]); |
122 | + | * Creates a console-based application instance. |
123 | * | |
124 | * Note: This is a function shortner for registerApplication(). | |
125 | * | |
126 | * @param mixed $params Application configurations. | |
127 | * @return object | |
128 | */ | |
129 | - | // |
129 | + | public static function runConsoleApplication($params = NULL) |
130 | { | |
131 | return self::registerApplication('PhpBakery\Console', $params); | |
132 | } | |
133 | ||
134 | /** | |
135 | * Returns the registered application instance. | |
136 | * | |
137 | * Note: This is function shortner for getApplication(). | |
138 | - | public function registerResource($params) |
138 | + | * |
139 | * @return object | |
140 | */ | |
141 | public static function app() | |
142 | { | |
143 | return self::getApplication(); | |
144 | } | |
145 | ||
146 | /* Application methods | |
147 | ===================================================== */ | |
148 | ||
149 | /** | |
150 | * Creates a new application instance. | |
151 | * | |
152 | * @param string $className Class name of the application. | |
153 | * @param mixed $params Application configurations. | |
154 | * @return object | |
155 | */ | |
156 | public static function registerApplication($className, $params = NULL) | |
157 | { | |
158 | return new $className($params); | |
159 | - | $this->importResource($class, TRUE); |
159 | + | |
160 | ||
161 | /** | |
162 | * Returns the registered application instance. | |
163 | * | |
164 | * @return object | |
165 | */ | |
166 | public static function getApplication() | |
167 | { | |
168 | return self::$_app; | |
169 | } | |
170 | ||
171 | /** | |
172 | * Set the application instance. | |
173 | * | |
174 | * Note: If the parameter is null, the existing application | |
175 | * will be removed. | |
176 | * | |
177 | * @param object $obj Application instance. | |
178 | */ | |
179 | - | public function importResource($alias, $force = FALSE) |
179 | + | public static function setApplication($obj) |
180 | { | |
181 | if (self::$_app === NULL || $obj === NULL) | |
182 | { | |
183 | self::$_app = $obj; | |
184 | } | |
185 | else | |
186 | { | |
187 | - | public function getAlias($alias) |
187 | + | |
188 | Throw new PhpBakery\Exception('Application instance can only be created once.'); | |
189 | - | if (isset($this->aliases[$alias])) |
189 | + | |
190 | } | |
191 | ||
192 | - | return $this->aliases[$alias]; |
192 | + | |
193 | ===================================================== */ | |
194 | ||
195 | /** | |
196 | * Register a new class autoloader. | |
197 | * | |
198 | * @param mixed $callback Valid php callback (function name or array) | |
199 | - | if (isset($this->aliases[$root_alias])) |
199 | + | * @param boolean $append Whether to append the new autoloader after the default autoloader. |
200 | */ | |
201 | public static function registerAutoloader($callback, $append = FALSE) | |
202 | - | return $this->aliases[$root_alias] = rtrim($this->aliases[$root_alias] . DS . str_replace('.', DS, substr($alias, $pos+1)), '*', DS); |
202 | + | |
203 | if ($append) | |
204 | { | |
205 | self::$_enableIncludePaths = FALSE; | |
206 | spl_autoload_register($callback); | |
207 | } | |
208 | else | |
209 | { | |
210 | spl_autoload_unregister( array($this, 'autoloader') ); | |
211 | spl_autoload_register($callback); | |
212 | spl_autoload_register( array($this, 'autoloader') ); | |
213 | } | |
214 | - | public function setAlias($alias, $path = NULL) |
214 | + | |
215 | ||
216 | /** | |
217 | * Class autoloader. | |
218 | - | unset($this->aliases[$alias]); |
218 | + | * |
219 | * Note: This method provided to be invoked within an __autoload() magic method. | |
220 | * | |
221 | * @param string $className Class name to be loaded. | |
222 | - | $this->aliases[$alias] = ltrim($path, '\\/'); |
222 | + | * @return boolean |
223 | */ | |
224 | public static function autoloader($className) | |
225 | { | |
226 | if (isset(self::$coreClassMap[$className])) | |
227 | { | |
228 | //Get class from the core class map. | |
229 | include(SYS_PATH . self::$coreClassMap[$className]); | |
230 | } | |
231 | else if (isset(self::$classMap[$className])) | |
232 | { | |
233 | //Get class from the normal class map. | |
234 | include(self::$classMap[$className]); | |
235 | } | |
236 | else | |
237 | { | |
238 | // | |
239 | // Dont know how to do this for now, first make the core classes etc. | |
240 | // This function is not needed then. | |
241 | // | |
242 | } | |
243 | ||
244 | return TRUE; | |
245 | } | |
246 | ||
247 | /* Resource methods | |
248 | ===================================================== */ | |
249 | ||
250 | /** | |
251 | * Creates an new object an initialize it based on the given configurations. | |
252 | * | |
253 | * @param mixed $params Resource configurations. (String or Array) | |
254 | * @return object | |
255 | */ | |
256 | public static function registerResource($params) | |
257 | { | |
258 | //Format parameters | |
259 | if (is_string($params)) | |
260 | { | |
261 | $class = $params; | |
262 | $params = array(); | |
263 | } | |
264 | else if (isset($params['class'])) | |
265 | { | |
266 | $class = $params['class']; | |
267 | unset($params['class']); | |
268 | } | |
269 | else | |
270 | { | |
271 | //Throw exception | |
272 | Throw new PhpBakery\Exception('Resource configurations must contain a string or array with the key "class".'); | |
273 | } | |
274 | ||
275 | //Check whether a class exists else import | |
276 | if (!class_exists($class, TRUE)) | |
277 | { | |
278 | self::importResource($class, TRUE); | |
279 | } | |
280 | ||
281 | //Register the component self | |
282 | if ( func_num_args() > 1 ) | |
283 | { | |
284 | $args = func_get_args(); | |
285 | unset($args[0]); | |
286 | ||
287 | $resource_reflection = new ReflectionClass($class); | |
288 | $resource = call_user_func_array(array($resource_reflection, 'newInstance'), $args); | |
289 | } | |
290 | else | |
291 | { | |
292 | $resource = new $class(); | |
293 | } | |
294 | ||
295 | return $resource; | |
296 | } | |
297 | ||
298 | /** | |
299 | * Import a resource class or directory. | |
300 | * | |
301 | * @param string $alias Alias path to the file | |
302 | * @param boolean $force Whether to include the file immediately. | |
303 | * @return string | |
304 | */ | |
305 | public static function importResource($alias, $force = FALSE) | |
306 | { | |
307 | // | |
308 | // Dont know how to do this for now, first make the core classes etc. | |
309 | // This function is not needed then. | |
310 | // | |
311 | } | |
312 | ||
313 | /** | |
314 | * Returns a path by the given alias. | |
315 | * | |
316 | * @param string $alias Alias from the path. | |
317 | * @return mixed | |
318 | */ | |
319 | public static function getAlias($alias) | |
320 | { | |
321 | if (isset(self::$aliases[$alias])) | |
322 | { | |
323 | //Get alias from alias cache | |
324 | return self::$aliases[$alias]; | |
325 | } | |
326 | else if ( ($pos = strpos($alias, '.')) !== FALSE ) | |
327 | { | |
328 | //Check whether a alias is having a root to return | |
329 | $root_alias = substr($alias, 0, $pos); | |
330 | ||
331 | if (isset(self::$aliases[$root_alias])) | |
332 | { | |
333 | //Get root alias from alias cache | |
334 | return self::$aliases[$root_alias] = rtrim(self::$aliases[$root_alias] . DS . str_replace('.', DS, substr($alias, $pos+1)), '*', DS); | |
335 | } | |
336 | ||
337 | // | |
338 | // Other options can be placed here like finding modules etc. | |
339 | // | |
340 | ||
341 | } | |
342 | ||
343 | return FALSE; | |
344 | } | |
345 | ||
346 | /** | |
347 | * Set a new alias path. | |
348 | * | |
349 | * Note: This method checks the existing path and normalizes it. | |
350 | * | |
351 | * @param string $alias Alias from the path. | |
352 | * @param string $path Path corresponding to the alias. | |
353 | */ | |
354 | public static function setAlias($alias, $path = NULL) | |
355 | { | |
356 | if (empty($path)) | |
357 | { | |
358 | unset(self::$aliases[$alias]); | |
359 | } | |
360 | else | |
361 | { | |
362 | self::$aliases[$alias] = ltrim($path, '\\/'); | |
363 | } | |
364 | } | |
365 | ||
366 | /* Logging methods | |
367 | ===================================================== */ | |
368 | ||
369 | } |