2016-12-09 4 views
4

Ich frage mich, wie Laravel unterscheidet zwischen Singletons (gemeinsame Instanzen) und konkrete Implementierungen, die im Container überschrieben werden können.Laravel Container und gemeinsame Instanzen

Der Behälter hat eine bind-Methode, die wie folgt aussieht:

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); 
    } 
} 

Es hat auch eine Singleton-Methode hat, die diese Funktion aufruft, aber mit dem gemeinsamen Argumente $ immer wahr zu sein wie so:

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

Der Unterschied hier ist, dass, obwohl sie beide in der $bindings Eigenschaft gebunden sind, der Singleton es so eingestellt:

[concrete, true] 

Wie macht es dies zu einem Singleton obwohl wenn es scheint nicht zu überprüfen, ob es bereits festgelegt wurde oder nicht? Nirgendwo kann ich herausfinden, ob es irgendwas mit der von uns gesetzten $ shared-Variablen macht.

Daneben gibt es auch eine andere Eigenschaft in dieser Klasse genannt:

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

Es wäre logisch erscheinen für einen Singleton hier am Ende, also was genau macht dieses

Beispiel der bind-Methode:

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

Antwort

3

bind() Methode spart $sharedhere. Dann make() method is using isSahred() Methode zur Überprüfung, ob $sharedis set und dann zur Überprüfung, ob es true oder falsehere ist.

+1

Danke, dass bringt mich einen Schritt näher, es scheint, die gemeinsamen Bindungen, die Singletons tatsächlich in die '' $ Instanz '' 'Array-Eigenschaft geschoben werden bei der Auflösung mit' '' make'''. Und das überprüfen Sie tatsächlich das Array zuvor. Ich kann jetzt tiefer eintauchen. Vielen Dank! –

Verwandte Themen