2008-05-30 11:40:08 +00:00
< ? php
/**
2009-11-06 06:46:59 +00:00
* CakePHP ( tm ) : Rapid Development Framework ( http :// cakephp . org )
2013-02-08 11:59:49 +00:00
* Copyright ( c ) Cake Software Foundation , Inc . ( http :// cakefoundation . org )
2008-05-30 11:40:08 +00:00
*
* Licensed under The MIT License
2013-02-08 12:22:51 +00:00
* For full copyright and license information , please see the LICENSE . txt
2008-05-30 11:40:08 +00:00
* Redistributions of files must retain the above copyright notice .
*
2013-02-08 11:59:49 +00:00
* @ copyright Copyright ( c ) Cake Software Foundation , Inc . ( http :// cakefoundation . org )
2009-11-06 06:00:11 +00:00
* @ link http :// cakephp . org CakePHP ( tm ) Project
2011-07-26 06:16:14 +00:00
* @ package Cake . Core
2008-10-30 17:30:26 +00:00
* @ since CakePHP ( tm ) v 1.0 . 0.2363
2009-11-06 06:51:51 +00:00
* @ license MIT License ( http :// www . opensource . org / licenses / mit - license . php )
2008-05-30 11:40:08 +00:00
*/
2009-07-25 22:57:49 +00:00
2012-03-08 04:26:40 +00:00
App :: uses ( 'Hash' , 'Utility' );
2012-01-29 18:30:05 +00:00
App :: uses ( 'ConfigReaderInterface' , 'Configure' );
2012-04-11 01:25:04 +00:00
/**
* Compatibility with 2.1 , which expects Configure to load Set .
*/
App :: uses ( 'Set' , 'Utility' );
2011-06-03 01:05:10 +00:00
2008-05-30 11:40:08 +00:00
/**
2010-11-14 23:26:54 +00:00
* Configuration class . Used for managing runtime configuration information .
*
* Provides features for reading and writing to the runtime configuration , as well
2011-03-16 11:29:39 +00:00
* as methods for loading additional configuration files or storing runtime configuration
2010-11-14 23:26:54 +00:00
* for future use .
2008-05-30 11:40:08 +00:00
*
2011-07-26 06:16:14 +00:00
* @ package Cake . Core
2011-10-15 16:08:49 +00:00
* @ link http :// book . cakephp . org / 2.0 / en / development / configuration . html #configure-class
2008-05-30 11:40:08 +00:00
*/
2010-07-06 01:50:36 +00:00
class Configure {
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
2010-07-05 02:00:49 +00:00
* Array of values currently stored in Configure .
2008-05-30 11:40:08 +00:00
*
2010-07-05 02:00:49 +00:00
* @ var array
2008-05-30 11:40:08 +00:00
*/
2010-07-06 01:50:36 +00:00
protected static $_values = array (
'debug' => 0
);
2010-07-05 02:00:49 +00:00
2010-12-04 05:09:11 +00:00
/**
* Configured reader classes , used to load config files from resources
*
* @ var array
* @ see Configure :: load ()
*/
protected static $_readers = array ();
2010-07-05 02:00:49 +00:00
/**
* Initializes configure and runs the bootstrap process .
2010-11-15 01:37:50 +00:00
* Bootstrapping includes the following steps :
*
* - Setup App array in Configure .
2011-06-20 00:28:40 +00:00
* - Include app / Config / core . php .
2010-11-15 01:37:50 +00:00
* - Configure core cache configurations .
* - Load App cache files .
2011-06-20 00:28:40 +00:00
* - Include app / Config / bootstrap . php .
2010-11-15 01:37:50 +00:00
* - Setup error / exception handlers .
2010-07-05 02:00:49 +00:00
*
2011-07-29 03:24:31 +00:00
* @ param boolean $boot
2010-07-05 02:00:49 +00:00
* @ return void
*/
2010-07-05 02:03:25 +00:00
public static function bootstrap ( $boot = true ) {
2010-11-15 01:37:50 +00:00
if ( $boot ) {
2010-12-04 21:29:34 +00:00
self :: write ( 'App' , array (
'base' => false ,
'baseUrl' => false ,
'dir' => APP_DIR ,
'webroot' => WEBROOT_DIR ,
'www_root' => WWW_ROOT
));
2010-11-15 01:37:50 +00:00
2012-03-04 00:34:07 +00:00
if ( ! include APP . 'Config' . DS . 'core.php' ) {
2011-04-17 11:13:02 +00:00
trigger_error ( __d ( 'cake_dev' , " Can't find application core file. Please create %score.php, and make sure it is readable by PHP. " , APP . 'Config' . DS ), E_USER_ERROR );
2010-11-15 01:37:50 +00:00
}
2011-07-16 01:14:39 +00:00
App :: $bootstrapping = false ;
2010-11-15 01:37:50 +00:00
App :: init ();
App :: build ();
2012-03-15 15:06:54 +00:00
2012-03-17 01:46:07 +00:00
$exception = array (
'handler' => 'ErrorHandler::handleException' ,
);
$error = array (
'handler' => 'ErrorHandler::handleError' ,
'level' => E_ALL & ~ E_DEPRECATED ,
);
self :: _setErrorHandlers ( $error , $exception );
2012-03-15 15:06:54 +00:00
2012-03-08 15:00:09 +00:00
if ( ! include APP . 'Config' . DS . 'bootstrap.php' ) {
trigger_error ( __d ( 'cake_dev' , " Can't find application bootstrap file. Please create %sbootstrap.php, and make sure it is readable by PHP. " , APP . 'Config' . DS ), E_USER_ERROR );
}
2012-03-17 00:56:24 +00:00
restore_error_handler ();
2012-03-15 15:06:54 +00:00
2012-03-17 01:46:07 +00:00
self :: _setErrorHandlers (
self :: $_values [ 'Error' ],
self :: $_values [ 'Exception' ]
);
2012-06-24 15:29:31 +00:00
// Preload Debugger + String in case of E_STRICT errors when loading files.
if ( self :: $_values [ 'debug' ] > 0 ) {
class_exists ( 'Debugger' );
class_exists ( 'String' );
}
2010-11-15 01:37:50 +00:00
}
2008-05-30 11:40:08 +00:00
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
2010-11-14 23:26:54 +00:00
* Used to store a dynamic variable in Configure .
2008-05-30 11:40:08 +00:00
*
2009-02-04 05:00:59 +00:00
* Usage :
* {{{
2008-05-30 11:40:08 +00:00
* Configure :: write ( 'One.key1' , 'value of the Configure::One[key1]' );
* Configure :: write ( array ( 'One.key1' => 'value of the Configure::One[key1]' ));
2008-12-17 04:13:45 +00:00
* Configure :: write ( 'One' , array (
* 'key1' => 'value of the Configure::One[key1]' ,
* 'key2' => 'value of the Configure::One[key2]'
* );
2009-06-07 22:24:10 +00:00
*
2008-12-17 04:13:45 +00:00
* Configure :: write ( array (
* 'One.key1' => 'value of the Configure::One[key1]' ,
* 'One.key2' => 'value of the Configure::One[key2]'
* ));
2009-02-04 05:00:59 +00:00
* }}}
2008-05-30 11:40:08 +00:00
*
2011-10-15 16:08:49 +00:00
* @ link http :// book . cakephp . org / 2.0 / en / development / configuration . html #Configure::write
2008-05-30 11:40:08 +00:00
* @ param array $config Name of var to write
* @ param mixed $value Value to set for var
2010-03-03 23:20:15 +00:00
* @ return boolean True if write was successful
2008-05-30 11:40:08 +00:00
*/
2010-04-15 04:06:17 +00:00
public static function write ( $config , $value = null ) {
2008-05-30 11:40:08 +00:00
if ( ! is_array ( $config )) {
$config = array ( $config => $value );
}
2009-07-24 20:50:50 +00:00
foreach ( $config as $name => $value ) {
2012-03-08 04:26:40 +00:00
self :: $_values = Hash :: insert ( self :: $_values , $name , $value );
2008-05-30 11:40:08 +00:00
}
2010-12-04 05:24:09 +00:00
if ( isset ( $config [ 'debug' ]) && function_exists ( 'ini_set' )) {
if ( self :: $_values [ 'debug' ]) {
ini_set ( 'display_errors' , 1 );
} else {
ini_set ( 'display_errors' , 0 );
2009-09-08 03:28:50 +00:00
}
2008-05-30 11:40:08 +00:00
}
2010-03-03 23:20:15 +00:00
return true ;
2008-05-30 11:40:08 +00:00
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
2012-12-22 22:48:15 +00:00
* Used to read information stored in Configure . Its not
2010-07-06 01:57:39 +00:00
* possible to store `null` values in Configure .
2008-05-30 11:40:08 +00:00
*
2009-11-15 23:09:04 +00:00
* Usage :
* {{{
2008-05-30 11:40:08 +00:00
* Configure :: read ( 'Name' ); will return all values for Name
* Configure :: read ( 'Name.key' ); will return only the value of Configure :: Name [ key ]
2009-11-15 23:09:04 +00:00
* }}}
2008-05-30 11:40:08 +00:00
*
2013-03-03 19:10:09 +00:00
* @ link http :// book . cakephp . org / 2.0 / en / development / configuration . html #Configure::read
2012-12-22 22:48:15 +00:00
* @ param string $var Variable to obtain . Use '.' to access array elements .
2010-07-06 01:57:39 +00:00
* @ return mixed value stored in configure , or null .
2008-05-30 11:40:08 +00:00
*/
2010-07-06 01:50:36 +00:00
public static function read ( $var = null ) {
if ( $var === null ) {
return self :: $_values ;
}
2012-03-08 04:26:40 +00:00
return Hash :: get ( self :: $_values , $var );
2008-05-30 11:40:08 +00:00
}
2009-07-24 19:18:37 +00:00
2012-09-03 23:04:48 +00:00
/**
* Returns true if given variable is set in Configure .
*
* @ param string $var Variable name to check for
* @ return boolean True if variable is there
*/
public static function check ( $var = null ) {
if ( empty ( $var )) {
return false ;
}
2012-09-15 00:33:05 +00:00
return Hash :: get ( self :: $_values , $var ) !== null ;
2012-09-03 23:04:48 +00:00
}
2008-05-30 11:40:08 +00:00
/**
2010-11-14 23:26:54 +00:00
* Used to delete a variable from Configure .
2008-05-30 11:40:08 +00:00
*
* Usage :
2009-11-15 23:09:04 +00:00
* {{{
2008-05-30 11:40:08 +00:00
* Configure :: delete ( 'Name' ); will delete the entire Configure :: Name
* Configure :: delete ( 'Name.key' ); will delete only the Configure :: Name [ key ]
2009-11-15 23:09:04 +00:00
* }}}
2008-05-30 11:40:08 +00:00
*
2011-10-15 16:08:49 +00:00
* @ link http :// book . cakephp . org / 2.0 / en / development / configuration . html #Configure::delete
2008-05-30 11:40:08 +00:00
* @ param string $var the var to be deleted
2008-09-25 16:49:56 +00:00
* @ return void
2008-05-30 11:40:08 +00:00
*/
2010-04-15 04:06:17 +00:00
public static function delete ( $var = null ) {
2012-03-08 04:26:40 +00:00
self :: $_values = Hash :: remove ( self :: $_values , $var );
2008-05-30 11:40:08 +00:00
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
2012-12-22 22:48:15 +00:00
* Add a new reader to Configure . Readers allow you to read configuration
* files in various formats / storage locations . CakePHP comes with two built - in readers
* PhpReader and IniReader . You can also implement your own reader classes in your application .
2010-11-14 23:26:54 +00:00
*
2010-12-04 05:09:11 +00:00
* To add a new reader to Configure :
2008-05-30 11:40:08 +00:00
*
2010-12-04 05:10:42 +00:00
* `Configure::config('ini', new IniReader());`
2008-05-30 11:40:08 +00:00
*
2012-12-22 22:48:15 +00:00
* @ param string $name The name of the reader being configured . This alias is used later to
2010-12-04 05:09:11 +00:00
* read values from a specific reader .
* @ param ConfigReaderInterface $reader The reader to append .
* @ return void
2008-05-30 11:40:08 +00:00
*/
2010-12-04 05:14:55 +00:00
public static function config ( $name , ConfigReaderInterface $reader ) {
self :: $_readers [ $name ] = $reader ;
2010-12-04 05:09:11 +00:00
}
2010-01-04 23:23:06 +00:00
2010-12-04 05:09:11 +00:00
/**
* Gets the names of the configured reader objects .
*
2011-07-29 03:24:31 +00:00
* @ param string $name
2010-12-04 05:09:11 +00:00
* @ return array Array of the configured reader objects .
*/
2010-12-05 03:57:33 +00:00
public static function configured ( $name = null ) {
if ( $name ) {
return isset ( self :: $_readers [ $name ]);
2008-05-30 11:40:08 +00:00
}
2010-12-04 05:09:11 +00:00
return array_keys ( self :: $_readers );
}
2008-05-30 11:40:08 +00:00
2010-12-04 05:14:55 +00:00
/**
2012-12-22 22:48:15 +00:00
* Remove a configured reader . This will unset the reader
2010-12-04 05:14:55 +00:00
* and make any future attempts to use it cause an Exception .
*
* @ param string $name Name of the reader to drop .
* @ return boolean Success
*/
public static function drop ( $name ) {
if ( ! isset ( self :: $_readers [ $name ])) {
2008-05-30 11:40:08 +00:00
return false ;
}
2010-12-04 05:14:55 +00:00
unset ( self :: $_readers [ $name ]);
return true ;
}
2008-05-30 11:40:08 +00:00
/**
2012-12-22 22:48:15 +00:00
* Loads stored configuration information from a resource . You can add
2010-12-04 15:41:23 +00:00
* config file resource readers with `Configure::config()` .
2010-11-14 23:26:54 +00:00
*
2011-04-02 14:00:59 +00:00
* Loaded configuration information will be merged with the current
2010-12-04 15:41:23 +00:00
* runtime configuration . You can load configuration files from plugins
2011-04-02 14:00:59 +00:00
* by preceding the filename with the plugin name .
2008-05-30 11:40:08 +00:00
*
2011-03-16 11:29:39 +00:00
* `Configure::load('Users.user', 'default')`
2010-12-04 15:41:23 +00:00
*
2012-12-22 22:48:15 +00:00
* Would load the 'user' config file using the default config reader . You can load
2010-12-04 15:41:23 +00:00
* app config files by giving the name of the resource you want loaded .
*
* `Configure::load('setup', 'default');`
2008-05-30 11:40:08 +00:00
*
2011-09-17 18:30:39 +00:00
* If using `default` config and no reader has been configured for it yet ,
* one will be automatically created using PhpReader
*
2011-10-15 16:08:49 +00:00
* @ link http :// book . cakephp . org / 2.0 / en / development / configuration . html #Configure::load
2010-12-04 17:15:47 +00:00
* @ param string $key name of configuration resource to load .
2011-04-02 14:00:59 +00:00
* @ param string $config Name of the configured reader to use to read the resource identified by $key .
2011-03-29 02:39:35 +00:00
* @ param boolean $merge if config files should be merged instead of simply overridden
2010-12-04 17:15:47 +00:00
* @ return mixed false if file not found , void if load successful .
2010-12-12 00:01:07 +00:00
* @ throws ConfigureException Will throw any exceptions the reader raises .
2008-05-30 11:40:08 +00:00
*/
2011-04-02 14:00:59 +00:00
public static function load ( $key , $config = 'default' , $merge = true ) {
2012-07-03 10:19:48 +00:00
$reader = self :: _getReader ( $config );
2012-07-03 10:43:33 +00:00
if ( ! $reader ) {
return false ;
}
2012-07-03 10:19:48 +00:00
$values = $reader -> read ( $key );
2011-04-17 10:35:21 +00:00
2011-03-29 02:39:35 +00:00
if ( $merge ) {
$keys = array_keys ( $values );
foreach ( $keys as $key ) {
if (( $c = self :: read ( $key )) && is_array ( $values [ $key ]) && is_array ( $c )) {
2012-03-08 04:26:40 +00:00
$values [ $key ] = Hash :: merge ( $c , $values [ $key ]);
2011-03-29 02:39:35 +00:00
}
}
}
2011-04-17 10:35:21 +00:00
2010-12-04 06:05:12 +00:00
return self :: write ( $values );
2008-05-30 11:40:08 +00:00
}
2009-07-24 19:18:37 +00:00
2012-04-20 02:45:01 +00:00
/**
2012-11-18 14:57:58 +00:00
* Dump data currently in Configure into $key . The serialization format
2012-12-22 22:48:15 +00:00
* is decided by the config reader attached as $config . For example , if the
2012-07-03 10:19:48 +00:00
* 'default' adapter is a PhpReader , the generated file will be a PHP
2012-05-01 01:07:32 +00:00
* configuration file loadable by the PhpReader .
*
* ## Usage
*
* Given that the 'default' reader is an instance of PhpReader .
* Save all data in Configure to the file `my_config.php` :
*
* `Configure::dump('my_config.php', 'default');`
*
* Save only the error handling configuration :
*
* `Configure::dump('error.php', 'default', array('Error', 'Exception');`
2012-04-20 02:45:01 +00:00
*
2012-04-22 00:26:35 +00:00
* @ param string $key The identifier to create in the config adapter .
* This could be a filename or a cache key depending on the adapter being used .
2012-04-20 02:45:01 +00:00
* @ param string $config The name of the configured adapter to dump data with .
2012-07-03 10:19:48 +00:00
* @ param array $keys The name of the top - level keys you want to dump .
2012-05-01 01:07:32 +00:00
* This allows you save only some data stored in Configure .
2012-04-22 00:26:35 +00:00
* @ return boolean success
2012-04-20 02:45:01 +00:00
* @ throws ConfigureException if the adapter does not implement a `dump` method .
*/
2012-05-01 01:07:32 +00:00
public static function dump ( $key , $config = 'default' , $keys = array ()) {
2012-07-03 10:19:48 +00:00
$reader = self :: _getReader ( $config );
2012-07-03 10:43:33 +00:00
if ( ! $reader ) {
2012-10-22 08:55:18 +00:00
throw new ConfigureException ( __d ( 'cake_dev' , 'There is no "%s" adapter.' , $config ));
2012-07-03 10:43:33 +00:00
}
2012-07-03 10:19:48 +00:00
if ( ! method_exists ( $reader , 'dump' )) {
2012-10-22 08:55:18 +00:00
throw new ConfigureException ( __d ( 'cake_dev' , 'The "%s" adapter, does not have a dump() method.' , $config ));
2012-04-20 02:45:01 +00:00
}
2012-05-01 01:07:32 +00:00
$values = self :: $_values ;
if ( ! empty ( $keys ) && is_array ( $keys )) {
$values = array_intersect_key ( $values , array_flip ( $keys ));
}
2012-07-03 10:19:48 +00:00
return ( bool ) $reader -> dump ( $key , $values );
}
/**
* Get the configured reader . Internally used by `Configure::load()` and `Configure::dump()`
* Will create new PhpReader for default if not configured yet .
*
* @ param string $config The name of the configured adapter
2012-07-03 10:43:33 +00:00
* @ return mixed Reader instance or false
2012-07-03 10:19:48 +00:00
*/
protected static function _getReader ( $config ) {
if ( ! isset ( self :: $_readers [ $config ])) {
if ( $config !== 'default' ) {
2012-07-03 10:43:33 +00:00
return false ;
2012-07-03 10:19:48 +00:00
}
App :: uses ( 'PhpReader' , 'Configure' );
self :: config ( $config , new PhpReader ());
}
return self :: $_readers [ $config ];
2012-04-20 02:45:01 +00:00
}
2008-05-30 11:40:08 +00:00
/**
2008-10-28 17:08:14 +00:00
* Used to determine the current version of CakePHP .
2008-05-30 11:40:08 +00:00
*
2009-11-15 23:09:04 +00:00
* Usage `Configure::version();`
2008-05-30 11:40:08 +00:00
*
* @ return string Current version of CakePHP
*/
2010-04-15 04:06:17 +00:00
public static function version () {
2010-07-05 02:00:49 +00:00
if ( ! isset ( self :: $_values [ 'Cake' ][ 'version' ])) {
2011-08-07 01:15:31 +00:00
require CAKE . 'Config' . DS . 'config.php' ;
2010-07-23 23:12:30 +00:00
self :: write ( $config );
2008-05-30 11:40:08 +00:00
}
2010-07-05 02:00:49 +00:00
return self :: $_values [ 'Cake' ][ 'version' ];
2008-05-30 11:40:08 +00:00
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
2012-12-22 22:48:15 +00:00
* Used to write runtime configuration into Cache . Stored runtime configuration can be
* restored using `Configure::restore()` . These methods can be used to enable configuration managers
2010-12-04 22:26:59 +00:00
* frontends , or other GUI type interfaces for configuration .
2008-05-30 11:40:08 +00:00
*
2010-12-04 22:26:59 +00:00
* @ param string $name The storage name for the saved configuration .
2012-12-22 22:48:15 +00:00
* @ param string $cacheConfig The cache configuration to save into . Defaults to 'default'
2010-12-04 22:26:59 +00:00
* @ param array $data Either an array of data to store , or leave empty to store all values .
* @ return boolean Success
2008-05-30 11:40:08 +00:00
*/
2010-12-04 22:26:59 +00:00
public static function store ( $name , $cacheConfig = 'default' , $data = null ) {
if ( $data === null ) {
$data = self :: $_values ;
2008-05-30 11:40:08 +00:00
}
2010-12-04 22:26:59 +00:00
return Cache :: write ( $name , $data , $cacheConfig );
2008-05-30 11:40:08 +00:00
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
2012-12-22 22:48:15 +00:00
* Restores configuration data stored in the Cache into configure . Restored
2010-12-04 22:26:59 +00:00
* values will overwrite existing ones .
2008-05-30 11:40:08 +00:00
*
2010-12-04 22:26:59 +00:00
* @ param string $name Name of the stored config file to load .
* @ param string $cacheConfig Name of the Cache configuration to read from .
* @ return boolean Success .
2008-05-30 11:40:08 +00:00
*/
2010-12-04 22:26:59 +00:00
public static function restore ( $name , $cacheConfig = 'default' ) {
$values = Cache :: read ( $name , $cacheConfig );
if ( $values ) {
return self :: write ( $values );
2008-05-30 11:40:08 +00:00
}
2010-12-04 22:26:59 +00:00
return false ;
2008-05-30 11:40:08 +00:00
}
2009-07-24 19:18:37 +00:00
2012-04-15 03:31:26 +00:00
/**
* Clear all values stored in Configure .
*
* @ return boolean success .
*/
public static function clear () {
self :: $_values = array ();
return true ;
}
2012-03-15 15:06:54 +00:00
/**
2012-03-17 01:46:07 +00:00
* Set the error and exception handlers .
2012-07-03 10:19:48 +00:00
*
2012-03-17 01:46:07 +00:00
* @ param array $error The Error handling configuration .
* @ param array $exception The exception handling configuration .
2012-03-15 15:06:54 +00:00
* @ return void
*/
2012-03-17 01:46:07 +00:00
protected static function _setErrorHandlers ( $error , $exception ) {
2012-03-15 15:06:54 +00:00
$level = - 1 ;
2012-03-17 01:46:07 +00:00
if ( isset ( $error [ 'level' ])) {
error_reporting ( $error [ 'level' ]);
$level = $error [ 'level' ];
2012-03-15 15:06:54 +00:00
}
2012-03-17 01:46:07 +00:00
if ( ! empty ( $error [ 'handler' ])) {
set_error_handler ( $error [ 'handler' ], $level );
2012-03-15 15:06:54 +00:00
}
2012-03-17 01:46:07 +00:00
if ( ! empty ( $exception [ 'handler' ])) {
set_exception_handler ( $exception [ 'handler' ]);
2012-03-15 15:06:54 +00:00
}
}
2012-03-04 00:34:07 +00:00
}