2016-12-09 2 views
4

Мне интересно, как Laravel различает однодольные (общие экземпляры) и конкретные реализации, которые могут быть перезаписаны внутри контейнера.Контейнер Laravel и общие экземпляры

Контейнер имеет метод связывания, который выглядит следующим образом:

public function bind($abstract, $concrete = null, $shared = false) 
{   
    // If no concrete type was given, we will simply set the concrete type to the 
    // abstract type. After that, the concrete type to be registered as shared 
    // without being forced to state their classes in both of the parameters. 
    $this->dropStaleInstances($abstract); 

    if (is_null($concrete)) { 
     $concrete = $abstract; 
    } 

    // If the factory is not a Closure, it means it is just a class name which is 
    // bound into this container to the abstract type and we will just wrap it 
    // up inside its own Closure to give us more convenience when extending. 
    if (!$concrete instanceof Closure) { 
     $concrete = $this->getClosure($abstract, $concrete); 
    } 

    $this->bindings[$abstract] = compact('concrete', 'shared'); 

    // If the abstract type was already resolved in this container we'll fire the 
    // rebound listener so that any objects which have already gotten resolved 
    // can have their copy of the object updated via the listener callbacks. 
    if ($this->resolved($abstract)) { 
     $this->rebound($abstract); 
    } 
} 

Он также имеет метод одноплодной, который вызывает эту функцию, но с $ общий аргумент всегда быть верным, как так:

public function singleton($abstract, $concrete = null) 
{ 
    $this->bind($abstract, $concrete, true); 
} 

Разница заключается в том, что, хотя оба они связаны в свойстве $bindings, синглтон устанавливает его так:

[concrete, true] 

Как это сделать синглтон, если, похоже, нет проверки, если он уже установлен или нет? Нигде не могу найти, что он делает что-либо с переменной $ shared, которую мы установили.

Кроме того, есть еще одно свойство этого класса называется:

/** 
* The container's shared instances. 
* 
* @var array 
*/ 
protected $instances = []; 

Казалось бы, логично одноэлементно закончить здесь, так что именно делает этот

Пример метода связывания:

https://github.com/laravel/framework/blob/5.3/src/Illuminate/Container/Container.php#L178

ответ

3

bind() метод сохраняет $sharedhere. Затем make() method is using isSahred() метод проверки, если $sharedis set, а затем для проверки, является ли оно true или falsehere.

+1

Спасибо, что приносит мне шаг ближе, кажется, что общие привязки, которые являются синглтонами, фактически попадают в свойство '' '' $ instance'''''' при разрешении '' 'make'''. И это на самом деле проверяет массив заранее. Теперь я могу углубиться в глубь. Благодаря! –

Смежные вопросы