| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214 | <?php namespace Laravel; defined('DS') or die('No direct script access.');use Closure;class Config {	/**	 * All of the loaded configuration items.	 *	 * The configuration arrays are keyed by their owning bundle and file.	 *	 * @var array	 */	public static $items = array();	/**	 * A cache of the parsed configuration items.	 *	 * @var array	 */	public static $cache = array();	/**	 * Determine if a configuration item or file exists.	 *	 * <code>	 *		// Determine if the "session" configuration file exists	 *		$exists = Config::has('session');	 *	 *		// Determine if the "timezone" option exists in the configuration	 *		$exists = Config::has('application.timezone');	 * </code>	 *	 * @param  string  $key	 * @return bool	 */	public static function has($key)	{		return ! is_null(static::get($key));	}	/**	 * Get a configuration item.	 *	 * If no item is requested, the entire configuration array will be returned.	 *	 * <code>	 *		// Get the "session" configuration array	 *		$session = Config::get('session');	 *	 *		// Get a configuration item from a bundle's configuration file	 *		$name = Config::get('admin::names.first');	 *	 *		// Get the "timezone" option from the "application" configuration file	 *		$timezone = Config::get('application.timezone');	 * </code>	 *	 * @param  string  $key	 * @return array	 */	public static function get($key)	{		list($bundle, $file, $item) = static::parse($key);		if ( ! static::load($bundle, $file)) return;		$items = static::$items[$bundle][$file];		// If a specific configuration item was not requested, the key will be null,		// meaning we need to return the entire array of configuration item from the		// requested configuration file. Otherwise we can return the item.		if (is_null($item))		{			return $items;		}		else		{			return array_get($items, $item);		}	}	/**	 * Set a configuration item's value.	 *	 * <code>	 *		// Set the "session" configuration array	 *		Config::set('session', $array);	 *	 *		// Set a configuration option that belongs by a bundle	 *		Config::set('admin::names.first', 'Taylor');	 *	 *		// Set the "timezone" option in the "application" configuration file	 *		Config::set('application.timezone', 'UTC');	 * </code>	 *	 * @param  string  $key	 * @param  mixed   $value	 * @return void	 */	public static function set($key, $value)	{		list($bundle, $file, $item) = static::parse($key);		static::load($bundle, $file);		// If the item is null, it means the developer wishes to set the entire		// configuration array to a given value, so we will pass the entire		// array for the bundle into the array_set method, otherwise we'll		// only pass the file array for the bundle.		if (is_null($item))		{			array_set(static::$items[$bundle], $file, $value);		}		else		{			array_set(static::$items[$bundle][$file], $item, $value);		}	}	/**	 * Parse a key and return its bundle, file, and key segments.	 *	 * Configuration items are named using the {bundle}::{file}.{item} convention.	 *	 * @param  string  $key	 * @return array	 */	protected static function parse($key)	{		// First, we'll check the keyed cache of configuration items, as this will		// be the fastest method of retrieving the configuration option. After an		// item is parsed, it is always stored in the cache by its key.		if (array_key_exists($key, static::$cache))		{			return static::$cache[$key];		}		$bundle = Bundle::name($key);		$segments = explode('.', Bundle::element($key));		// If there are not at least two segments in the array, it means that the		// developer is requesting the entire configuration array to be returned.		// If that is the case, we'll make the item field of the array "null".		if (count($segments) >= 2)		{			$parsed = array($bundle, $segments[0], implode('.', array_slice($segments, 1)));		}		else		{			$parsed = array($bundle, $segments[0], null);		}		return static::$cache[$key] = $parsed;	}	/**	 * Load all of the configuration items from a configuration file.	 *	 * @param  string  $bundle	 * @param  string  $file	 * @return bool	 */	public static function load($bundle, $file)	{		if (isset(static::$items[$bundle][$file])) return true;		$config = array();		// Configuration files cascade. Typically, the bundle configuration array is		// loaded first, followed by the environment array, providing the convenient		// cascading of configuration options across environments.		foreach (static::paths($bundle) as $directory)		{			if ($directory !== '' and file_exists($path = $directory.$file.EXT))			{				$config = array_merge($config, require $path);			}		}		if (count($config) > 0)		{			static::$items[$bundle][$file] = $config;		}		return isset(static::$items[$bundle][$file]);	}	/**	 * Get the array of configuration paths that should be searched for a bundle.	 *	 * @param  string  $bundle	 * @return array	 */	protected static function paths($bundle)	{		$paths[] = Bundle::path($bundle).'config/';		// Configuration files can be made specific for a given environment. If an		// environment has been set, we will merge the environment configuration		// in last, so that it overrides all other options.		//		// This allows the developer to quickly and easily create configurations		// for various scenarios, such as local development and production,		// without constantly changing configuration files.		if (isset($_SERVER['LARAVEL_ENV']))		{			$paths[] = $paths[count($paths) - 1].$_SERVER['LARAVEL_ENV'].'/';		}		return $paths;	}}
 |