pictcode / lib / Cake / Core / Configure.php @ 0b1b8047
履歴 | 表示 | アノテート | ダウンロード (14.31 KB)
1 | 635eef61 | spyder1211 | <?php
|
---|---|---|---|
2 | /**
|
||
3 | * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
|
||
4 | * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||
5 | *
|
||
6 | * Licensed under The MIT License
|
||
7 | * For full copyright and license information, please see the LICENSE.txt
|
||
8 | * Redistributions of files must retain the above copyright notice.
|
||
9 | *
|
||
10 | * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||
11 | * @link http://cakephp.org CakePHP(tm) Project
|
||
12 | * @package Cake.Core
|
||
13 | * @since CakePHP(tm) v 1.0.0.2363
|
||
14 | * @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||
15 | */
|
||
16 | |||
17 | App::uses('Hash', 'Utility'); |
||
18 | App::uses('ConfigReaderInterface', 'Configure'); |
||
19 | |||
20 | /**
|
||
21 | * Compatibility with 2.1, which expects Configure to load Set.
|
||
22 | */
|
||
23 | App::uses('Set', 'Utility'); |
||
24 | |||
25 | /**
|
||
26 | * Configuration class. Used for managing runtime configuration information.
|
||
27 | *
|
||
28 | * Provides features for reading and writing to the runtime configuration, as well
|
||
29 | * as methods for loading additional configuration files or storing runtime configuration
|
||
30 | * for future use.
|
||
31 | *
|
||
32 | * @package Cake.Core
|
||
33 | * @link http://book.cakephp.org/2.0/en/development/configuration.html#configure-class
|
||
34 | */
|
||
35 | class Configure { |
||
36 | |||
37 | /**
|
||
38 | * Array of values currently stored in Configure.
|
||
39 | *
|
||
40 | * @var array
|
||
41 | */
|
||
42 | protected static $_values = array( |
||
43 | 'debug' => 0 |
||
44 | ); |
||
45 | |||
46 | /**
|
||
47 | * Configured reader classes, used to load config files from resources
|
||
48 | *
|
||
49 | * @var array
|
||
50 | * @see Configure::load()
|
||
51 | */
|
||
52 | protected static $_readers = array(); |
||
53 | |||
54 | /**
|
||
55 | * Initializes configure and runs the bootstrap process.
|
||
56 | * Bootstrapping includes the following steps:
|
||
57 | *
|
||
58 | * - Setup App array in Configure.
|
||
59 | * - Include app/Config/core.php.
|
||
60 | * - Configure core cache configurations.
|
||
61 | * - Load App cache files.
|
||
62 | * - Include app/Config/bootstrap.php.
|
||
63 | * - Setup error/exception handlers.
|
||
64 | *
|
||
65 | * @param bool $boot Whether to do bootstrapping.
|
||
66 | * @return void
|
||
67 | */
|
||
68 | public static function bootstrap($boot = true) { |
||
69 | if ($boot) { |
||
70 | static::_appDefaults();
|
||
71 | |||
72 | if (!include APP . 'Config' . DS . 'core.php') { |
||
73 | trigger_error(__d('cake_dev', |
||
74 | "Can't find application core file. Please create %s, and make sure it is readable by PHP.",
|
||
75 | APP . 'Config' . DS . 'core.php'), |
||
76 | E_USER_ERROR
|
||
77 | ); |
||
78 | } |
||
79 | App::init();
|
||
80 | App::$bootstrapping = false; |
||
81 | App::build();
|
||
82 | |||
83 | $exception = array( |
||
84 | 'handler' => 'ErrorHandler::handleException', |
||
85 | ); |
||
86 | $error = array( |
||
87 | 'handler' => 'ErrorHandler::handleError', |
||
88 | 'level' => E_ALL & ~E_DEPRECATED, |
||
89 | ); |
||
90 | if (PHP_SAPI === 'cli') { |
||
91 | App::uses('ConsoleErrorHandler', 'Console'); |
||
92 | $console = new ConsoleErrorHandler(); |
||
93 | $exception['handler'] = array($console, 'handleException'); |
||
94 | $error['handler'] = array($console, 'handleError'); |
||
95 | } |
||
96 | static::_setErrorHandlers($error, $exception); |
||
97 | |||
98 | if (!include APP . 'Config' . DS . 'bootstrap.php') { |
||
99 | trigger_error(__d('cake_dev', |
||
100 | "Can't find application bootstrap file. Please create %s, and make sure it is readable by PHP.",
|
||
101 | APP . 'Config' . DS . 'bootstrap.php'), |
||
102 | E_USER_ERROR
|
||
103 | ); |
||
104 | } |
||
105 | restore_error_handler(); |
||
106 | |||
107 | static::_setErrorHandlers(
|
||
108 | static::$_values['Error'], |
||
109 | static::$_values['Exception'] |
||
110 | ); |
||
111 | |||
112 | // Preload Debugger + CakeText in case of E_STRICT errors when loading files.
|
||
113 | if (static::$_values['debug'] > 0) { |
||
114 | class_exists('Debugger'); |
||
115 | class_exists('CakeText'); |
||
116 | } |
||
117 | } |
||
118 | } |
||
119 | |||
120 | /**
|
||
121 | * Set app's default configs
|
||
122 | *
|
||
123 | * @return void
|
||
124 | */
|
||
125 | protected static function _appDefaults() { |
||
126 | static::write('App', (array)static::read('App') + array( |
||
127 | 'base' => false, |
||
128 | 'baseUrl' => false, |
||
129 | 'dir' => APP_DIR, |
||
130 | 'webroot' => WEBROOT_DIR, |
||
131 | 'www_root' => WWW_ROOT |
||
132 | )); |
||
133 | } |
||
134 | |||
135 | /**
|
||
136 | * Used to store a dynamic variable in Configure.
|
||
137 | *
|
||
138 | * Usage:
|
||
139 | * ```
|
||
140 | * Configure::write('One.key1', 'value of the Configure::One[key1]');
|
||
141 | * Configure::write(array('One.key1' => 'value of the Configure::One[key1]'));
|
||
142 | * Configure::write('One', array(
|
||
143 | * 'key1' => 'value of the Configure::One[key1]',
|
||
144 | * 'key2' => 'value of the Configure::One[key2]'
|
||
145 | * );
|
||
146 | *
|
||
147 | * Configure::write(array(
|
||
148 | * 'One.key1' => 'value of the Configure::One[key1]',
|
||
149 | * 'One.key2' => 'value of the Configure::One[key2]'
|
||
150 | * ));
|
||
151 | * ```
|
||
152 | *
|
||
153 | * @param string|array $config The key to write, can be a dot notation value.
|
||
154 | * Alternatively can be an array containing key(s) and value(s).
|
||
155 | * @param mixed $value Value to set for var
|
||
156 | * @return bool True if write was successful
|
||
157 | * @link http://book.cakephp.org/2.0/en/development/configuration.html#Configure::write
|
||
158 | */
|
||
159 | public static function write($config, $value = null) { |
||
160 | if (!is_array($config)) { |
||
161 | $config = array($config => $value); |
||
162 | } |
||
163 | |||
164 | foreach ($config as $name => $value) { |
||
165 | static::$_values = Hash::insert(static::$_values, $name, $value); |
||
166 | } |
||
167 | |||
168 | if (isset($config['debug']) && function_exists('ini_set')) { |
||
169 | if (static::$_values['debug']) { |
||
170 | ini_set('display_errors', 1); |
||
171 | } else {
|
||
172 | ini_set('display_errors', 0); |
||
173 | } |
||
174 | } |
||
175 | return true; |
||
176 | } |
||
177 | |||
178 | /**
|
||
179 | * Used to read information stored in Configure. It's not
|
||
180 | * possible to store `null` values in Configure.
|
||
181 | *
|
||
182 | * Usage:
|
||
183 | * ```
|
||
184 | * Configure::read('Name'); will return all values for Name
|
||
185 | * Configure::read('Name.key'); will return only the value of Configure::Name[key]
|
||
186 | * ```
|
||
187 | *
|
||
188 | * @param string|null $var Variable to obtain. Use '.' to access array elements.
|
||
189 | * @return mixed value stored in configure, or null.
|
||
190 | * @link http://book.cakephp.org/2.0/en/development/configuration.html#Configure::read
|
||
191 | */
|
||
192 | public static function read($var = null) { |
||
193 | if ($var === null) { |
||
194 | return static::$_values; |
||
195 | } |
||
196 | return Hash::get(static::$_values, $var); |
||
197 | } |
||
198 | |||
199 | /**
|
||
200 | * Used to read and delete a variable from Configure.
|
||
201 | *
|
||
202 | * This is primarily used during bootstrapping to move configuration data
|
||
203 | * out of configure into the various other classes in CakePHP.
|
||
204 | *
|
||
205 | * @param string $var The key to read and remove.
|
||
206 | * @return array|null
|
||
207 | */
|
||
208 | public static function consume($var) { |
||
209 | $simple = strpos($var, '.') === false; |
||
210 | if ($simple && !isset(static::$_values[$var])) { |
||
211 | return null; |
||
212 | } |
||
213 | if ($simple) { |
||
214 | $value = static::$_values[$var]; |
||
215 | unset(static::$_values[$var]); |
||
216 | return $value; |
||
217 | } |
||
218 | $value = Hash::get(static::$_values, $var); |
||
219 | static::$_values = Hash::remove(static::$_values, $var); |
||
220 | return $value; |
||
221 | } |
||
222 | |||
223 | /**
|
||
224 | * Returns true if given variable is set in Configure.
|
||
225 | *
|
||
226 | * @param string $var Variable name to check for
|
||
227 | * @return bool True if variable is there
|
||
228 | */
|
||
229 | public static function check($var) { |
||
230 | if (empty($var)) { |
||
231 | return false; |
||
232 | } |
||
233 | return Hash::get(static::$_values, $var) !== null; |
||
234 | } |
||
235 | |||
236 | /**
|
||
237 | * Used to delete a variable from Configure.
|
||
238 | *
|
||
239 | * Usage:
|
||
240 | * ```
|
||
241 | * Configure::delete('Name'); will delete the entire Configure::Name
|
||
242 | * Configure::delete('Name.key'); will delete only the Configure::Name[key]
|
||
243 | * ```
|
||
244 | *
|
||
245 | * @param string $var the var to be deleted
|
||
246 | * @return void
|
||
247 | * @link http://book.cakephp.org/2.0/en/development/configuration.html#Configure::delete
|
||
248 | */
|
||
249 | public static function delete($var) { |
||
250 | static::$_values = Hash::remove(static::$_values, $var); |
||
251 | } |
||
252 | |||
253 | /**
|
||
254 | * Add a new reader to Configure. Readers allow you to read configuration
|
||
255 | * files in various formats/storage locations. CakePHP comes with two built-in readers
|
||
256 | * PhpReader and IniReader. You can also implement your own reader classes in your application.
|
||
257 | *
|
||
258 | * To add a new reader to Configure:
|
||
259 | *
|
||
260 | * `Configure::config('ini', new IniReader());`
|
||
261 | *
|
||
262 | * @param string $name The name of the reader being configured. This alias is used later to
|
||
263 | * read values from a specific reader.
|
||
264 | * @param ConfigReaderInterface $reader The reader to append.
|
||
265 | * @return void
|
||
266 | */
|
||
267 | public static function config($name, ConfigReaderInterface $reader) { |
||
268 | static::$_readers[$name] = $reader; |
||
269 | } |
||
270 | |||
271 | /**
|
||
272 | * Gets the names of the configured reader objects.
|
||
273 | *
|
||
274 | * @param string|null $name Name to check. If null returns all configured reader names.
|
||
275 | * @return array Array of the configured reader objects.
|
||
276 | */
|
||
277 | public static function configured($name = null) { |
||
278 | if ($name) { |
||
279 | return isset(static::$_readers[$name]); |
||
280 | } |
||
281 | return array_keys(static::$_readers); |
||
282 | } |
||
283 | |||
284 | /**
|
||
285 | * Remove a configured reader. This will unset the reader
|
||
286 | * and make any future attempts to use it cause an Exception.
|
||
287 | *
|
||
288 | * @param string $name Name of the reader to drop.
|
||
289 | * @return bool Success
|
||
290 | */
|
||
291 | public static function drop($name) { |
||
292 | if (!isset(static::$_readers[$name])) { |
||
293 | return false; |
||
294 | } |
||
295 | unset(static::$_readers[$name]); |
||
296 | return true; |
||
297 | } |
||
298 | |||
299 | /**
|
||
300 | * Loads stored configuration information from a resource. You can add
|
||
301 | * config file resource readers with `Configure::config()`.
|
||
302 | *
|
||
303 | * Loaded configuration information will be merged with the current
|
||
304 | * runtime configuration. You can load configuration files from plugins
|
||
305 | * by preceding the filename with the plugin name.
|
||
306 | *
|
||
307 | * `Configure::load('Users.user', 'default')`
|
||
308 | *
|
||
309 | * Would load the 'user' config file using the default config reader. You can load
|
||
310 | * app config files by giving the name of the resource you want loaded.
|
||
311 | *
|
||
312 | * `Configure::load('setup', 'default');`
|
||
313 | *
|
||
314 | * If using `default` config and no reader has been configured for it yet,
|
||
315 | * one will be automatically created using PhpReader
|
||
316 | *
|
||
317 | * @param string $key name of configuration resource to load.
|
||
318 | * @param string $config Name of the configured reader to use to read the resource identified by $key.
|
||
319 | * @param bool $merge if config files should be merged instead of simply overridden
|
||
320 | * @return bool False if file not found, true if load successful.
|
||
321 | * @throws ConfigureException Will throw any exceptions the reader raises.
|
||
322 | * @link http://book.cakephp.org/2.0/en/development/configuration.html#Configure::load
|
||
323 | */
|
||
324 | public static function load($key, $config = 'default', $merge = true) { |
||
325 | $reader = static::_getReader($config); |
||
326 | if (!$reader) { |
||
327 | return false; |
||
328 | } |
||
329 | $values = $reader->read($key); |
||
330 | |||
331 | if ($merge) { |
||
332 | $keys = array_keys($values); |
||
333 | foreach ($keys as $key) { |
||
334 | if (($c = static::read($key)) && is_array($values[$key]) && is_array($c)) { |
||
335 | $values[$key] = Hash::merge($c, $values[$key]); |
||
336 | } |
||
337 | } |
||
338 | } |
||
339 | |||
340 | return static::write($values); |
||
341 | } |
||
342 | |||
343 | /**
|
||
344 | * Dump data currently in Configure into $key. The serialization format
|
||
345 | * is decided by the config reader attached as $config. For example, if the
|
||
346 | * 'default' adapter is a PhpReader, the generated file will be a PHP
|
||
347 | * configuration file loadable by the PhpReader.
|
||
348 | *
|
||
349 | * ## Usage
|
||
350 | *
|
||
351 | * Given that the 'default' reader is an instance of PhpReader.
|
||
352 | * Save all data in Configure to the file `my_config.php`:
|
||
353 | *
|
||
354 | * `Configure::dump('my_config.php', 'default');`
|
||
355 | *
|
||
356 | * Save only the error handling configuration:
|
||
357 | *
|
||
358 | * `Configure::dump('error.php', 'default', array('Error', 'Exception');`
|
||
359 | *
|
||
360 | * @param string $key The identifier to create in the config adapter.
|
||
361 | * This could be a filename or a cache key depending on the adapter being used.
|
||
362 | * @param string $config The name of the configured adapter to dump data with.
|
||
363 | * @param array $keys The name of the top-level keys you want to dump.
|
||
364 | * This allows you save only some data stored in Configure.
|
||
365 | * @return bool success
|
||
366 | * @throws ConfigureException if the adapter does not implement a `dump` method.
|
||
367 | */
|
||
368 | public static function dump($key, $config = 'default', $keys = array()) { |
||
369 | $reader = static::_getReader($config); |
||
370 | if (!$reader) { |
||
371 | throw new ConfigureException(__d('cake_dev', 'There is no "%s" adapter.', $config)); |
||
372 | } |
||
373 | if (!method_exists($reader, 'dump')) { |
||
374 | throw new ConfigureException(__d('cake_dev', 'The "%s" adapter, does not have a %s method.', $config, 'dump()')); |
||
375 | } |
||
376 | $values = static::$_values; |
||
377 | if (!empty($keys) && is_array($keys)) { |
||
378 | $values = array_intersect_key($values, array_flip($keys)); |
||
379 | } |
||
380 | return (bool)$reader->dump($key, $values); |
||
381 | } |
||
382 | |||
383 | /**
|
||
384 | * Get the configured reader. Internally used by `Configure::load()` and `Configure::dump()`
|
||
385 | * Will create new PhpReader for default if not configured yet.
|
||
386 | *
|
||
387 | * @param string $config The name of the configured adapter
|
||
388 | * @return mixed Reader instance or false
|
||
389 | */
|
||
390 | protected static function _getReader($config) { |
||
391 | if (!isset(static::$_readers[$config])) { |
||
392 | if ($config !== 'default') { |
||
393 | return false; |
||
394 | } |
||
395 | App::uses('PhpReader', 'Configure'); |
||
396 | static::config($config, new PhpReader()); |
||
397 | } |
||
398 | return static::$_readers[$config]; |
||
399 | } |
||
400 | |||
401 | /**
|
||
402 | * Used to determine the current version of CakePHP.
|
||
403 | *
|
||
404 | * Usage `Configure::version();`
|
||
405 | *
|
||
406 | * @return string Current version of CakePHP
|
||
407 | */
|
||
408 | public static function version() { |
||
409 | if (!isset(static::$_values['Cake']['version'])) { |
||
410 | require CAKE . 'Config' . DS . 'config.php'; |
||
411 | static::write($config); |
||
412 | } |
||
413 | return static::$_values['Cake']['version']; |
||
414 | } |
||
415 | |||
416 | /**
|
||
417 | * Used to write runtime configuration into Cache. Stored runtime configuration can be
|
||
418 | * restored using `Configure::restore()`. These methods can be used to enable configuration managers
|
||
419 | * frontends, or other GUI type interfaces for configuration.
|
||
420 | *
|
||
421 | * @param string $name The storage name for the saved configuration.
|
||
422 | * @param string $cacheConfig The cache configuration to save into. Defaults to 'default'
|
||
423 | * @param array $data Either an array of data to store, or leave empty to store all values.
|
||
424 | * @return bool Success
|
||
425 | */
|
||
426 | public static function store($name, $cacheConfig = 'default', $data = null) { |
||
427 | if ($data === null) { |
||
428 | $data = static::$_values; |
||
429 | } |
||
430 | return Cache::write($name, $data, $cacheConfig); |
||
431 | } |
||
432 | |||
433 | /**
|
||
434 | * Restores configuration data stored in the Cache into configure. Restored
|
||
435 | * values will overwrite existing ones.
|
||
436 | *
|
||
437 | * @param string $name Name of the stored config file to load.
|
||
438 | * @param string $cacheConfig Name of the Cache configuration to read from.
|
||
439 | * @return bool Success.
|
||
440 | */
|
||
441 | public static function restore($name, $cacheConfig = 'default') { |
||
442 | $values = Cache::read($name, $cacheConfig); |
||
443 | if ($values) { |
||
444 | return static::write($values); |
||
445 | } |
||
446 | return false; |
||
447 | } |
||
448 | |||
449 | /**
|
||
450 | * Clear all values stored in Configure.
|
||
451 | *
|
||
452 | * @return bool Success.
|
||
453 | */
|
||
454 | public static function clear() { |
||
455 | static::$_values = array(); |
||
456 | return true; |
||
457 | } |
||
458 | |||
459 | /**
|
||
460 | * Set the error and exception handlers.
|
||
461 | *
|
||
462 | * @param array $error The Error handling configuration.
|
||
463 | * @param array $exception The exception handling configuration.
|
||
464 | * @return void
|
||
465 | */
|
||
466 | protected static function _setErrorHandlers($error, $exception) { |
||
467 | $level = -1; |
||
468 | if (isset($error['level'])) { |
||
469 | error_reporting($error['level']); |
||
470 | $level = $error['level']; |
||
471 | } |
||
472 | if (!empty($error['handler'])) { |
||
473 | set_error_handler($error['handler'], $level); |
||
474 | } |
||
475 | if (!empty($exception['handler'])) { |
||
476 | set_exception_handler($exception['handler']); |
||
477 | } |
||
478 | } |
||
479 | |||
480 | } |