2016-01-27 01:46:43 +01:00
|
|
|
<?php
|
|
|
|
|
2016-08-19 00:51:35 +02:00
|
|
|
namespace SilverStripe\Core\Injector;
|
2016-01-27 01:46:43 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* 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();
|
|
|
|
*
|
2016-08-19 00:51:35 +02:00
|
|
|
* @param string $classOrArgument The first argument, or class name (if called directly
|
|
|
|
* on Object).
|
|
|
|
* @param mixed $argument,... arguments to pass to the constructor
|
2016-01-27 01:46:43 +01:00
|
|
|
* @return static
|
|
|
|
*/
|
2016-08-19 00:51:35 +02:00
|
|
|
public static function create($classOrArgument = null, $argument = null) {
|
2016-01-27 01:46:43 +01:00
|
|
|
$args = func_get_args();
|
|
|
|
|
|
|
|
// Class to create should be the calling class if not Object,
|
|
|
|
// otherwise the first parameter
|
|
|
|
$class = get_called_class();
|
2016-08-19 00:51:35 +02:00
|
|
|
if($class == 'SilverStripe\\Core\\Object') {
|
2016-01-27 01:46:43 +01:00
|
|
|
$class = array_shift($args);
|
|
|
|
}
|
|
|
|
|
2016-08-19 00:51:35 +02:00
|
|
|
return Injector::inst()->createWithArgs($class, $args);
|
2016-01-27 01:46:43 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 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);
|
|
|
|
}
|
|
|
|
}
|