2016-01-27 01:46:43 +01:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace SilverStripe\Framework\Core;
|
|
|
|
|
|
|
|
use Injector;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* A class that can be instantiated or replaced via DI
|
|
|
|
*/
|
|
|
|
trait Injectable {
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* An implementation of the factory method, allows you to create an instance of a class
|
|
|
|
*
|
|
|
|
* This method will defer class substitution to the Injector API, which can be customised
|
|
|
|
* via the Config API to declare substitution classes.
|
|
|
|
*
|
|
|
|
* This can be called in one of two ways - either calling via the class directly,
|
|
|
|
* or calling on Object and passing the class name as the first parameter. The following
|
|
|
|
* are equivalent:
|
|
|
|
* $list = DataList::create('SiteTree');
|
|
|
|
* $list = SiteTree::get();
|
|
|
|
*
|
|
|
|
* @param string $class the class name
|
|
|
|
* @param mixed $arguments,... arguments to pass to the constructor
|
|
|
|
* @return static
|
|
|
|
*/
|
|
|
|
public static function create() {
|
|
|
|
$args = func_get_args();
|
|
|
|
|
|
|
|
// Class to create should be the calling class if not Object,
|
|
|
|
// otherwise the first parameter
|
|
|
|
$class = get_called_class();
|
|
|
|
if($class == 'Object') {
|
|
|
|
$class = array_shift($args);
|
|
|
|
}
|
|
|
|
|
|
|
|
return \Injector::inst()->createWithArgs($class, $args);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Creates a class instance by the "singleton" design pattern.
|
|
|
|
* It will always return the same instance for this class,
|
|
|
|
* which can be used for performance reasons and as a simple
|
|
|
|
* way to access instance methods which don't rely on instance
|
|
|
|
* data (e.g. the custom SilverStripe static handling).
|
|
|
|
*
|
2016-04-12 00:24:16 +02:00
|
|
|
* @param string $class Optional classname to create, if the called class should not be used
|
2016-01-27 01:46:43 +01:00
|
|
|
* @return static The singleton instance
|
|
|
|
*/
|
2016-04-12 00:24:16 +02:00
|
|
|
public static function singleton($class = null) {
|
|
|
|
if(!$class) {
|
|
|
|
$class = get_called_class();
|
2016-01-27 01:46:43 +01:00
|
|
|
}
|
|
|
|
return Injector::inst()->get($class);
|
|
|
|
}
|
|
|
|
}
|