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
2008-10-30 17:30:26 +00:00
* @ package cake
* @ subpackage cake . cake . libs
* @ 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
* as methods for loading additional configuration files or storing runtime configuration
* for future use .
2008-05-30 11:40:08 +00:00
*
2008-10-30 17:30:26 +00:00
* @ package cake
* @ subpackage cake . 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 ) {
self :: write ( 'App' , array ( 'base' => false , 'baseUrl' => false , 'dir' => APP_DIR , 'webroot' => WEBROOT_DIR , 'www_root' => WWW_ROOT ));
if ( ! include ( CONFIGS . 'core.php' )) {
trigger_error ( sprintf ( __ ( " Can't find application core file. Please create %score.php, and make sure it is readable by PHP. " ), CONFIGS ), E_USER_ERROR );
}
if ( Configure :: read ( 'Cache.disable' ) !== true ) {
$cache = Cache :: config ( 'default' );
if ( empty ( $cache [ 'settings' ])) {
trigger_error ( __ ( 'Cache not configured properly. Please check Cache::config(); in APP/config/core.php' ), E_USER_WARNING );
$cache = Cache :: config ( 'default' , array ( 'engine' => 'File' ));
}
$path = $prefix = $duration = null ;
if ( ! empty ( $cache [ 'settings' ][ 'path' ])) {
$path = realpath ( $cache [ 'settings' ][ 'path' ]);
} else {
$prefix = $cache [ 'settings' ][ 'prefix' ];
}
if ( Configure :: read ( 'debug' ) >= 1 ) {
$duration = '+10 seconds' ;
} else {
$duration = '+999 days' ;
}
if ( Cache :: config ( '_cake_core_' ) === false ) {
Cache :: config ( '_cake_core_' , array_merge (( array ) $cache [ 'settings' ], array (
'prefix' => $prefix . 'cake_core_' , 'path' => $path . DS . 'persistent' . DS ,
'serialize' => true , 'duration' => $duration
)));
}
if ( Cache :: config ( '_cake_model_' ) === false ) {
Cache :: config ( '_cake_model_' , array_merge (( array ) $cache [ 'settings' ], array (
'prefix' => $prefix . 'cake_model_' , 'path' => $path . DS . 'models' . DS ,
'serialize' => true , 'duration' => $duration
)));
}
}
App :: init ();
App :: build ();
if ( ! include ( CONFIGS . 'bootstrap.php' )) {
trigger_error ( sprintf ( __ ( " Can't find application bootstrap file. Please create %sbootstrap.php, and make sure it is readable by PHP. " ), CONFIGS ), E_USER_ERROR );
}
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
2010-12-04 05:09:11 +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 .
*
* To add a new reader to Configure :
*
2010-12-04 05:10:42 +00:00
* `Configure::config('ini', new IniReader());`
2010-12-04 05:09:11 +00:00
*
2010-12-04 05:14:55 +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
*/
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
}
/**
* Gets the names of the configured reader objects .
*
* @ return array Array of the configured reader objects .
*/
public static function configured () {
return array_keys ( self :: $_readers );
}
2010-12-04 05:14:55 +00:00
/**
* Remove a configured reader . This will unset the reader
* 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 ])) {
return false ;
}
unset ( self :: $_readers [ $name ]);
return true ;
}
2008-05-30 11:40:08 +00:00
/**
2008-10-28 17:08:14 +00:00
* Loads a file from app / config / configure_file . php .
2010-11-14 23:26:54 +00:00
*
2008-10-28 17:08:14 +00:00
* Config file variables should be formated like :
2009-11-15 23:09:04 +00:00
* `$config['name'] = 'value';`
2010-01-04 23:23:06 +00:00
* These will be used to create dynamic Configure vars . load () is also used to
2009-11-15 23:09:04 +00:00
* load stored config files created with Configure :: store ()
2008-05-30 11:40:08 +00:00
*
2009-11-15 23:09:04 +00:00
* - To load config files from app / config use `Configure::load('configure_file');` .
* - To load config files from a plugin `Configure::load('plugin.configure_file');` .
2008-05-30 11:40:08 +00:00
*
2010-03-28 15:34:58 +00:00
* @ link http :// book . cakephp . org / view / 929 / load
2008-12-17 04:13:45 +00:00
* @ param string $fileName name of file to load , extension must be . php and only the name
2009-11-15 23:09:04 +00:00
* should be used , not the extenstion
2008-09-25 16:49:56 +00:00
* @ return mixed false if file not found , void if load successful
2008-05-30 11:40:08 +00:00
*/
2010-04-15 04:06:17 +00:00
public static function load ( $fileName ) {
2009-11-16 00:55:20 +00:00
$found = $plugin = $pluginPath = false ;
list ( $plugin , $fileName ) = pluginSplit ( $fileName );
if ( $plugin ) {
$pluginPath = App :: pluginPath ( $plugin );
2009-11-15 21:59:19 +00:00
}
2009-11-25 18:41:19 +00:00
$pos = strpos ( $fileName , '..' );
2010-01-04 23:23:06 +00:00
2009-11-25 18:41:19 +00:00
if ( $pos === false ) {
if ( $pluginPath && file_exists ( $pluginPath . 'config' . DS . $fileName . '.php' )) {
include ( $pluginPath . 'config' . DS . $fileName . '.php' );
$found = true ;
} elseif ( file_exists ( CONFIGS . $fileName . '.php' )) {
include ( CONFIGS . $fileName . '.php' );
$found = true ;
} elseif ( file_exists ( CACHE . 'persistent' . DS . $fileName . '.php' )) {
include ( CACHE . 'persistent' . DS . $fileName . '.php' );
$found = true ;
} else {
foreach ( App :: core ( 'cake' ) as $key => $path ) {
if ( file_exists ( $path . DS . 'config' . DS . $fileName . '.php' )) {
include ( $path . DS . 'config' . DS . $fileName . '.php' );
$found = true ;
break ;
}
2008-05-30 11:40:08 +00:00
}
}
}
if ( ! $found ) {
return false ;
}
if ( ! isset ( $config )) {
2010-04-15 15:52:49 +00:00
trigger_error ( sprintf ( __ ( 'Configure::load() - no variable $config found in %s.php' ), $fileName ), E_USER_WARNING );
2008-05-30 11:40:08 +00:00
return false ;
}
2010-07-23 23:12:30 +00:00
return self :: write ( $config );
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' ])) {
2008-05-30 11:40:08 +00:00
require ( CORE_PATH . 'cake' . DS . '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
/**
2008-10-28 17:08:14 +00:00
* Used to write a config file to disk .
2008-05-30 11:40:08 +00:00
*
2009-11-15 23:09:04 +00:00
* {{{
2009-11-16 00:55:20 +00:00
* Configure :: store ( 'Model' , 'class_paths' , array ( 'Users' => array (
2008-12-17 04:13:45 +00:00
* 'path' => 'users' , 'plugin' => true
* )));
2009-11-15 23:09:04 +00:00
* }}}
2008-05-30 11:40:08 +00:00
*
* @ param string $type Type of config file to write , ex : Models , Controllers , Helpers , Components
* @ param string $name file name .
* @ param array $data array of values to store .
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 store ( $type , $name , $data = array ()) {
2008-05-30 11:40:08 +00:00
$write = true ;
$content = '' ;
foreach ( $data as $key => $value ) {
2009-11-14 19:30:22 +00:00
$content .= " \$ config[' $type '][' $key '] = " . var_export ( $value , true ) . " ; \n " ;
2008-05-30 11:40:08 +00:00
}
if ( is_null ( $type )) {
$write = false ;
}
2010-07-23 23:12:30 +00:00
self :: __writeConfig ( $content , $name , $write );
2008-05-30 11:40:08 +00:00
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* Creates a cached version of a configuration file .
* Appends values passed from Configure :: store () to the cached file
*
* @ param string $content Content to write on file
* @ param string $name Name to use for cache file
* @ param boolean $write true if content should be written , false otherwise
2008-09-25 16:49:56 +00:00
* @ return void
2008-05-30 11:40:08 +00:00
* @ access private
*/
2010-07-05 02:00:49 +00:00
private static function __writeConfig ( $content , $name , $write = true ) {
2008-05-30 11:40:08 +00:00
$file = CACHE . 'persistent' . DS . $name . '.php' ;
2010-07-23 23:12:30 +00:00
if ( self :: read ( 'debug' ) > 0 ) {
2008-05-30 11:40:08 +00:00
$expires = " +10 seconds " ;
} else {
$expires = " +999 days " ;
}
$cache = cache ( 'persistent' . DS . $name . '.php' , null , $expires );
if ( $cache === null ) {
cache ( 'persistent' . DS . $name . '.php' , " <?php \n \$ config = array(); \n " , $expires );
}
if ( $write === true ) {
2010-07-23 23:12:30 +00:00
$fileClass = new SplFileObject ( $file , 'a' );
if ( $fileClass -> isWritable ()) {
$fileClass -> fwrite ( $content );
2008-05-30 11:40:08 +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 .
*
* @ param string $key
* @ return array An array of data to merge into the runtime configuration
*/
function read ( $key );
2010-11-15 01:34:10 +00:00
}