2008-05-30 11:40:08 +00:00
< ? php
/**
2010-11-14 18:02:17 +00:00
* Configure class
2008-05-30 11:40:08 +00:00
*
2010-10-03 16:38:58 +00:00
* PHP 5
2008-05-30 11:40:08 +00:00
*
2009-11-06 06:46:59 +00:00
* CakePHP ( tm ) : Rapid Development Framework ( http :// cakephp . org )
2010-01-26 19:18:20 +00:00
* Copyright 2005 - 2010 , Cake Software Foundation , Inc . ( http :// cakefoundation . org )
2008-05-30 11:40:08 +00:00
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice .
*
2010-01-26 19:18:20 +00:00
* @ copyright Copyright 2005 - 2010 , Cake Software Foundation , Inc . ( http :// cakefoundation . org )
2009-11-06 06:00:11 +00:00
* @ link http :// cakephp . org CakePHP ( tm ) Project
2010-12-24 18:57:20 +00:00
* @ package cake . libs
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
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
*
2010-12-24 18:57:20 +00:00
* @ package cake . libs
2010-03-28 15:34:58 +00:00
* @ link http :// book . cakephp . org / view / 924 / The - Configuration - 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 .
* - Include app / config / core . php .
* - Configure core cache configurations .
* - Load App cache files .
* - Include app / config / bootstrap . php .
* - Setup error / exception handlers .
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
if ( ! include ( CONFIGS . 'core.php' )) {
2011-03-20 15:35:43 +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. " , CONFIGS ), E_USER_ERROR );
2010-11-15 01:37:50 +00:00
}
App :: init ();
App :: build ();
if ( ! include ( CONFIGS . 'bootstrap.php' )) {
2011-03-20 15:35:43 +00:00
trigger_error ( __d ( 'cake_dev' , " Can't find application bootstrap file. Please create %sbootstrap.php, and make sure it is readable by PHP. " , CONFIGS ), E_USER_ERROR );
2010-11-15 01:37:50 +00:00
}
2010-11-27 19:32:43 +00:00
$level = - 1 ;
2010-11-15 01:56:03 +00:00
if ( isset ( self :: $_values [ 'Error' ][ 'level' ])) {
error_reporting ( self :: $_values [ 'Error' ][ 'level' ]);
2010-11-27 19:32:43 +00:00
$level = self :: $_values [ 'Error' ][ 'level' ];
}
if ( ! empty ( self :: $_values [ 'Error' ][ 'handler' ])) {
set_error_handler ( self :: $_values [ 'Error' ][ 'handler' ], $level );
2010-11-15 01:56:03 +00:00
}
2010-11-15 01:37:50 +00:00
if ( ! empty ( self :: $_values [ 'Exception' ][ 'handler' ])) {
set_exception_handler ( self :: $_values [ 'Exception' ][ 'handler' ]);
}
}
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
*
2010-03-28 15:34:58 +00:00
* @ link http :// book . cakephp . org / view / 926 / 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 ) {
if ( strpos ( $name , '.' ) === false ) {
2010-07-05 02:00:49 +00:00
self :: $_values [ $name ] = $value ;
2009-07-24 20:50:50 +00:00
} else {
2009-11-22 00:57:04 +00:00
$names = explode ( '.' , $name , 4 );
switch ( count ( $names )) {
case 2 :
2010-07-05 02:00:49 +00:00
self :: $_values [ $names [ 0 ]][ $names [ 1 ]] = $value ;
2009-11-22 00:57:04 +00:00
break ;
case 3 :
2010-07-05 02:00:49 +00:00
self :: $_values [ $names [ 0 ]][ $names [ 1 ]][ $names [ 2 ]] = $value ;
2010-09-06 20:53:04 +00:00
break ;
2009-11-22 00:57:04 +00:00
case 4 :
$names = explode ( '.' , $name , 2 );
2010-07-05 02:00:49 +00:00
if ( ! isset ( self :: $_values [ $names [ 0 ]])) {
self :: $_values [ $names [ 0 ]] = array ();
2009-11-22 00:57:04 +00:00
}
2010-07-05 02:00:49 +00:00
self :: $_values [ $names [ 0 ]] = Set :: insert ( self :: $_values [ $names [ 0 ]], $names [ 1 ], $value );
2009-11-22 00:57:04 +00:00
break ;
2009-07-24 20:50:50 +00:00
}
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
/**
2010-11-14 23:26:54 +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
*
2010-03-28 15:34:58 +00:00
* @ link http :// book . cakephp . org / view / 927 / read
2009-11-15 23:09:04 +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 ;
}
if ( isset ( self :: $_values [ $var ])) {
return self :: $_values [ $var ];
2008-05-30 11:40:08 +00:00
}
2009-07-24 20:50:50 +00:00
if ( strpos ( $var , '.' ) !== false ) {
2009-11-22 00:57:04 +00:00
$names = explode ( '.' , $var , 3 );
2009-07-24 20:50:50 +00:00
$var = $names [ 0 ];
2008-05-30 11:40:08 +00:00
}
2010-07-05 02:00:49 +00:00
if ( ! isset ( self :: $_values [ $var ])) {
2009-07-24 20:50:50 +00:00
return null ;
2008-05-30 11:40:08 +00:00
}
2009-11-22 00:57:04 +00:00
switch ( count ( $names )) {
case 2 :
2010-07-05 02:00:49 +00:00
if ( isset ( self :: $_values [ $var ][ $names [ 1 ]])) {
return self :: $_values [ $var ][ $names [ 1 ]];
2009-11-22 00:57:04 +00:00
}
break ;
case 3 :
2010-07-05 02:00:49 +00:00
if ( isset ( self :: $_values [ $var ][ $names [ 1 ]][ $names [ 2 ]])) {
return self :: $_values [ $var ][ $names [ 1 ]][ $names [ 2 ]];
2009-11-22 00:57:04 +00:00
}
2010-07-05 02:00:49 +00:00
if ( ! isset ( self :: $_values [ $var ][ $names [ 1 ]])) {
2009-11-22 00:57:04 +00:00
return null ;
}
2010-07-05 02:00:49 +00:00
return Set :: classicExtract ( self :: $_values [ $var ][ $names [ 1 ]], $names [ 2 ]);
2009-11-22 00:57:04 +00:00
break ;
}
return null ;
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 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
*
2010-03-28 15:34:58 +00:00
* @ link http :// book . cakephp . org / view / 928 / 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 ) {
2009-07-24 20:50:50 +00:00
if ( strpos ( $var , '.' ) === false ) {
2010-07-05 02:00:49 +00:00
unset ( self :: $_values [ $var ]);
2009-07-24 20:50:50 +00:00
return ;
2008-05-30 11:40:08 +00:00
}
2009-07-24 20:50:50 +00:00
$names = explode ( '.' , $var , 2 );
2010-07-05 02:00:49 +00:00
self :: $_values [ $names [ 0 ]] = Set :: remove ( self :: $_values [ $names [ 0 ]], $names [ 1 ]);
2008-05-30 11:40:08 +00:00
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
2011-03-16 11:29:39 +00:00
* Add a new reader to Configure . Readers allow you to read configuration
2010-12-04 05:09:11 +00:00
* 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
*
2011-03-16 11:29:39 +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 .
*
* @ 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
/**
2011-03-16 11:29:39 +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
/**
2010-12-04 15:41:23 +00:00
* Loads stored configuration information from a resource . You can add
* 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
*
* Would load the 'user' config file using the default config reader . You can load
* 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
*
2010-03-28 15:34:58 +00:00
* @ link http :// book . cakephp . org / view / 929 / 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 ) {
2010-12-04 06:05:12 +00:00
if ( ! isset ( self :: $_readers [ $config ])) {
2008-05-30 11:40:08 +00:00
return false ;
}
2010-12-04 06:05:12 +00:00
$values = self :: $_readers [ $config ] -> read ( $key );
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 )) {
$values [ $key ] = array_merge_recursive ( $c , $values [ $key ]);
}
}
}
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
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
*
2010-03-28 15:34:58 +00:00
* @ link http :// book . cakephp . org / view / 930 / 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' ])) {
2010-12-07 05:56:10 +00:00
require ( LIBS . '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
/**
2010-12-04 22:26:59 +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
* 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 .
* @ param string $cacheConfig The cache configuration to save into . Defaults to 'default'
* @ 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
/**
2010-12-04 22:26:59 +00:00
* Restores configuration data stored in the Cache into configure . Restored
* 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
}
2010-12-04 05:09:11 +00:00
}
2009-07-24 19:18:37 +00:00
2010-12-04 05:09:11 +00:00
/**
* An interface for creating objects compatible with Configure :: load ()
*
* @ package cake . libs
*/
interface ConfigReaderInterface {
/**
* Read method is used for reading configuration information from sources .
* These sources can either be static resources like files , or dynamic ones like
* a database , or other datasource .
*
2011-03-16 11:29:39 +00:00
* @ param string $key
2010-12-04 05:09:11 +00:00
* @ return array An array of data to merge into the runtime configuration
*/
function read ( $key );
2010-11-15 01:34:10 +00:00
}