2013-05-20 12:18:07 +02:00
|
|
|
<?php
|
|
|
|
|
|
|
|
/**
|
2014-08-15 08:53:05 +02:00
|
|
|
* Use the SilverStripe configuration system to lookup config for a
|
2013-05-20 12:18:07 +02:00
|
|
|
* particular service.
|
|
|
|
*
|
|
|
|
* @package framework
|
|
|
|
* @subpackage injector
|
|
|
|
*/
|
2014-03-12 02:58:49 +01:00
|
|
|
class SilverStripeServiceConfigurationLocator extends ServiceConfigurationLocator {
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2014-03-12 02:58:49 +01:00
|
|
|
/**
|
|
|
|
* List of Injector configurations cached from Config in class => config format.
|
|
|
|
* If any config is false, this denotes that this class and all its parents
|
|
|
|
* have no configuration specified.
|
|
|
|
*
|
|
|
|
* @var array
|
|
|
|
*/
|
|
|
|
protected $configs = array();
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2013-05-20 12:18:07 +02:00
|
|
|
public function locateConfigFor($name) {
|
2014-03-12 02:58:49 +01:00
|
|
|
// Check direct or cached result
|
|
|
|
$config = $this->configFor($name);
|
|
|
|
if($config !== null) return $config;
|
2013-05-20 12:18:07 +02:00
|
|
|
|
|
|
|
// do parent lookup if it's a class
|
|
|
|
if (class_exists($name)) {
|
|
|
|
$parents = array_reverse(array_keys(ClassInfo::ancestry($name)));
|
|
|
|
array_shift($parents);
|
2014-03-12 02:58:49 +01:00
|
|
|
|
2013-05-20 12:18:07 +02:00
|
|
|
foreach ($parents as $parent) {
|
2014-08-15 08:53:05 +02:00
|
|
|
// have we already got for this?
|
2014-03-12 02:58:49 +01:00
|
|
|
$config = $this->configFor($parent);
|
|
|
|
if($config !== null) {
|
|
|
|
// Cache this result
|
2013-05-20 12:18:07 +02:00
|
|
|
$this->configs[$name] = $config;
|
|
|
|
return $config;
|
|
|
|
}
|
|
|
|
}
|
2014-03-12 02:58:49 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// there is no parent config, so we'll record that as false so we don't do the expensive
|
|
|
|
// lookup through parents again
|
|
|
|
$this->configs[$name] = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Retrieves the config for a named service without performing a hierarchy walk
|
|
|
|
*
|
|
|
|
* @param string $name Name of service
|
|
|
|
* @return mixed Returns either the configuration data, if there is any. A missing config is denoted
|
|
|
|
* by a value of either null (there is no direct config assigned and a hierarchy walk is necessary)
|
|
|
|
* or false (there is no config for this class, nor within the hierarchy for this class).
|
|
|
|
*/
|
|
|
|
protected function configFor($name) {
|
|
|
|
|
|
|
|
// Return cached result
|
|
|
|
if (isset($this->configs[$name])) {
|
|
|
|
return $this->configs[$name]; // Potentially false
|
|
|
|
}
|
|
|
|
|
|
|
|
$config = Config::inst()->get('Injector', $name);
|
|
|
|
if ($config) {
|
|
|
|
$this->configs[$name] = $config;
|
|
|
|
return $config;
|
|
|
|
} else {
|
|
|
|
return null;
|
2013-05-20 12:18:07 +02:00
|
|
|
}
|
|
|
|
}
|
2014-11-18 00:45:54 +01:00
|
|
|
}
|