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