Laravel-Core: Почему Laravel сохраняет псевдонимы несколько раз?

Laravel делает в своем ядре в Application.php множество решений по умолчанию, например:

'url' => ['Illuminate\Routing\UrlGenerator', 'Illuminate\Contracts\Routing\UrlGenerator'], 

Который в эффекте вызовет метод ниже двух раз

 public function alias($abstract, $alias) { $this->aliases[$alias] = $abstract; } 

что приводит к следующим значениям в Container->aliases :

 "Illuminate\Routing\UrlGenerator" => "url" "Illuminate\Contracts\Routing\UrlGenerator" => "url" 

Если я позже позвоню: $this->app->alias('url', 'App\Util\Portal\UrlGenerator'); он даже хранит его в течение времени в контейнере в массиве псевдонимов:

 "App\Util\Portal\UrlGenerator" => "url" 

Мой вопрос:

Почему laravel хранит их все два или три и не отменяет их? Достаточно хранить конкретный класс. Но почему laravel хранит их все три? Как может laravel сказать, какой из них решить, когда я теперь использую App :: make ('url')? Теперь у Laravel есть три варианта: один интерфейс и две реализации.

После того, как Сон пропустил ночь над ним и выкопал больше кода (еще не был проверен на 100% в коде), скорее всего, это:

«Сглаживание»

Используется различными способами / методами:

  1. Это может означать псевдоним Facade (например, URL-адрес FacadeClass). Что-то совершенно другое (!?)
  2. Это может означать отображение так называемого «абстрактного» (term / string), такого как «url», на «псевдоним», который в терминах laravel является классом или (!) Интерфейсом. Алиасинг (как это делает выше) не имеет прямого отношения к привязке.

«Привязка»

Laravel Container имеет два свойства в своем классе Container с именем $aliases и $bindings. Привязки имеют реальную привязку «абстрактного» к конкретному классу, чтобы стимулировать! Таким образом, каждый псевдоним (как описано выше) должен также (!) Иметь соответствующую привязку (!) От «абстрактного» конкретного класса, подлежащего инстанцированию.

Вывод

Фактически, как написано выше, существуют псевдонимы (конкретных классов и интерфейсов) к ключевому / абстрактному «url». Но они не имеют ничего общего с инстанцирующим процессом. Для того, чтобы псевдоним работать там, также обязательно должен быть реальным обязательным!

Таким образом, в действительности «Псевдонимы контейнера» позволяют вам получить доступ к существующей привязке с другими классами или именами интерфейсов.

  1. Если вы вызываете Container::make() с любым из псевдонимов, laravel попытается разрешить их к «абстрактному» (здесь «url»).
  2. И затем на втором этапе этот абстрактный «url» затем пытается разрешить против привязок (что совсем другое).
  3. Если для псевдонима не найдено привязки, возникает ошибка.

Таким образом, вы можете иметь произвольное количество псевдонимов, но только одно связывание, и вы должны иметь эту единственную привязку (дополнительно!).

(Интересно, что если вы сопоставляете псевдоним с тем же классом, что и привязка, он, похоже, заканчивается ошибкой рекурсии, но это также может быть проблемой xdebug).