123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- <?php
- /**
- * Wrapper for configuration arrays. Multiple configuration readers can be
- * attached to allow loading configuration from files, database, etc.
- *
- * Configuration directives cascade across config sources in the same way that
- * files cascade across the filesystem.
- *
- * Directives from sources high in the sources list will override ones from those
- * below them.
- *
- * @package Kohana
- * @category Configuration
- * @author Kohana Team
- * @copyright (c) Kohana Team
- * @license https://koseven.ga/LICENSE.md
- */
- class Kohana_Config {
- // Configuration readers
- protected $_sources = [];
- // Array of config groups
- protected $_groups = [];
- /**
- * Attach a configuration reader. By default, the reader will be added as
- * the first used reader. However, if the reader should be used only when
- * all other readers fail, use `FALSE` for the second parameter.
- *
- * $config->attach($reader); // Try first
- * $config->attach($reader, FALSE); // Try last
- *
- * @param Kohana_Config_Source $source instance
- * @param boolean $first add the reader as the first used object
- * @return $this
- */
- public function attach(Kohana_Config_Source $source, $first = TRUE)
- {
- if ($first === TRUE)
- {
- // Place the log reader at the top of the stack
- array_unshift($this->_sources, $source);
- }
- else
- {
- // Place the reader at the bottom of the stack
- $this->_sources[] = $source;
- }
- // Clear any cached _groups
- $this->_groups = [];
- return $this;
- }
- /**
- * Detach a configuration reader.
- *
- * $config->detach($reader);
- *
- * @param Kohana_Config_Source $source instance
- * @return $this
- */
- public function detach(Kohana_Config_Source $source)
- {
- if (($key = array_search($source, $this->_sources)) !== FALSE)
- {
- // Remove the writer
- unset($this->_sources[$key]);
- }
- return $this;
- }
- /**
- * Load a configuration group. Searches all the config sources, merging all the
- * directives found into a single config group. Any changes made to the config
- * in this group will be mirrored across all writable sources.
- *
- * $array = $config->load($name);
- *
- * See [Kohana_Config_Group] for more info
- *
- * @param string $group configuration group name
- * @return Kohana_Config_Group
- * @throws Kohana_Exception
- */
- public function load($group)
- {
- if ( ! count($this->_sources))
- {
- throw new Kohana_Exception('No configuration sources attached');
- }
- if (empty($group))
- {
- throw new Kohana_Exception("Need to specify a config group");
- }
- if ( ! is_string($group))
- {
- throw new Kohana_Exception("Config group must be a string");
- }
- if (strpos($group, '.') !== FALSE)
- {
- // Split the config group and path
- list($group, $path) = explode('.', $group, 2);
- }
- if (isset($this->_groups[$group]))
- {
- if (isset($path))
- {
- return Arr::path($this->_groups[$group], $path, NULL, '.');
- }
- return $this->_groups[$group];
- }
- $config = [];
- // We search from the "lowest" source and work our way up
- $sources = array_reverse($this->_sources);
- foreach ($sources as $source)
- {
- if ($source instanceof Kohana_Config_Reader)
- {
- if ($source_config = $source->load($group))
- {
- $config = Arr::merge($config, $source_config);
- }
- }
- }
- $this->_groups[$group] = new Config_Group($this, $group, $config);
- if (isset($path))
- {
- return Arr::path($config, $path, NULL, '.');
- }
- return $this->_groups[$group];
- }
- /**
- * Copy one configuration group to all of the other writers.
- *
- * $config->copy($name);
- *
- * @param string $group configuration group name
- * @return $this
- */
- public function copy($group)
- {
- // Load the configuration group
- $config = $this->load($group);
- foreach ($config->as_array() as $key => $value)
- {
- $this->_write_config($group, $key, $value);
- }
- return $this;
- }
- /**
- * Callback used by the config group to store changes made to configuration
- *
- * @param string $group Group name
- * @param string $key Variable name
- * @param mixed $value The new value
- * @return Kohana_Config Chainable instance
- */
- public function _write_config($group, $key, $value)
- {
- foreach ($this->_sources as $source)
- {
- if ( ! ($source instanceof Kohana_Config_Writer))
- {
- continue;
- }
- // Copy each value in the config
- $source->write($group, $key, $value);
- }
- return $this;
- }
- }
|