config.php 4.99 KB
Newer Older
1 2 3
<?php namespace Laravel; defined('APP_PATH') or die('No direct script access.');

use Closure;
4 5 6 7

class Config {

	/**
8 9
	 * All of the loaded configuration items.
	 *
10
	 * The configuration arrays are keyed by their owning bundle and file.
11 12 13
	 *
	 * @var array
	 */
14
	public static $items = array();
15 16

	/**
17
	 * A cache of the loaded configuration items.
18 19 20
	 *
	 * @var array
	 */
21
	public static $cache = array();
22 23 24 25 26 27 28 29

	/**
	 * Determine if a configuration item or file exists.
	 *
	 * <code>
	 *		// Determine if the "session" configuration file exists
	 *		$exists = Config::has('session');
	 *
30
	 *		// Determine if the "timezone" option exists in the configuration
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
	 *		$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');
	 *
51 52 53
	 *		// Get a configuration item from a bundle's configuration file
	 *		$name = Config::get('admin::names.first');
	 *
54 55 56 57 58 59 60
	 *		// Get the "timezone" option from the "application" configuration file
	 *		$timezone = Config::get('application.timezone');
	 * </code>
	 *
	 * @param  string  $key
	 * @return array
	 */
61
	public static function get($key)
62
	{
63 64 65 66
		// 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 retrieved, it is always stored in the cache by its key.
		if (array_key_exists($key, static::$cache))
67
		{
68
			return static::$cache[$key];
69 70
		}

71 72 73 74 75
		list($bundle, $file, $item) = static::parse($key);

		if ( ! static::load($bundle, $file)) return;

		$items = static::$items[$bundle][$file];
76

77 78 79
		// 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.
80 81 82
		$value = (is_null($item)) ? $items : array_get($items, $item);

		return static::$cache[$key] = $value;
83 84 85 86 87 88 89 90 91
	}

	/**
	 * Set a configuration item's value.
	 *
	 * <code>
	 *		// Set the "session" configuration array
	 *		Config::set('session', $array);
	 *
92 93 94
	 *		// Set a configuration option that belongs by a bundle
	 *		Config::set('admin::names.first', 'Taylor');
	 *
95 96 97 98 99 100 101 102 103 104
	 *		// 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)
	{
105
		static::$cache[$key] = $value;
106 107 108
	}

	/**
109
	 * Parse a key and return its bundle, file, and key segments.
110
	 *
111
	 * Configuration items are named using the {bundle}::{file}.{item} convention.
112
	 *
113 114 115 116 117
	 * @param  string  $key
	 * @return array
	 */
	protected static function parse($key)
	{
118
		$bundle = Bundle::name($key);
119

120 121 122 123 124
		$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".
125 126
		if (count($segments) >= 2)
		{
127
			return array($bundle, $segments[0], implode('.', array_slice($segments, 1)));
128 129 130
		}
		else
		{
131
			return array($bundle, $segments[0], null);
132
		}
133 134 135 136 137
	}

	/**
	 * Load all of the configuration items from a configuration file.
	 *
138
	 * @param  string  $bundle
139 140 141
	 * @param  string  $file
	 * @return bool
	 */
142
	public static function load($bundle, $file)
143
	{
144
		if (isset(static::$items[$bundle][$file])) return true;
145 146 147

		$config = array();

148 149 150 151
		// 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)
152
		{
153
			if ($directory !== '' and file_exists($path = $directory.$file.EXT))
154 155 156 157 158
			{
				$config = array_merge($config, require $path);
			}
		}

159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187
		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'].'/';
		}
188

189
		return $paths;
190 191
	}

Taylor Otwell committed
192
}