2015-09-22 24 views
6

laravel robi w swoim rdzeniu w Application.php zarejestrować wiele wdrożeń domyślne tak:Laravel-Core: Dlaczego Laravel przechowuje aliasy wiele razy?

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

co w Effekt wywołać metodę poniżej dwa razy

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

skutkuje następującymi wartościami w Container->aliases:

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

Gdybym później zadzwonić: $this->app->alias('url', 'App\Util\Portal\UrlGenerator'); nawet sklepy on Thrid czas w pojemniku im tablicę alias:

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

Moje pytanie:

Dlaczego laravel przechowywać je wszystkie dwa lub trzy, a nie je zastąpić? Powinno wystarczyć do przechowywania klasy betonu. Ale dlaczego laravel przechowuje je wszystkie trzy? W jaki sposób laravel może powiedzieć, który z nich rozwiązać, kiedy teraz używam App :: make ("url")? Laravel ma teraz trzy opcje do wyboru, jeden interfejs i dwie implementacje.

Odpowiedz

3

po spaniu noc nad nim i kopanie więcej w kodzie (mogą jeszcze nie być w 100% zweryfikowane w kodzie jeszcze) jego najprawdopodobniej jako że:

„aliasing”

Jest stosowany w różne sposoby/metody:

  1. Może to oznaczać alias a Fasada (jak URL do FacadeClass). Co jest czymś zupełnie innym (!?)
  2. Może to oznaczać odwzorowanie tzw. "Abstrakcji" (słowa/łańcucha), jak "url", na "alias", który w terminologii laralnej jest wtedy klasą lub (!) Interfejsem. Aliasing (podobnie jak w powyższej metodzie) NIE musi bezpośrednio robić nic z wiązaniem.

„Wiązanie”

laravel Pojemnik ma dwie właściwości w swojej klasie Container nazwanych $aliases i $bindings. Wiązania posiadają prawdziwe wiązanie „abstrakcyjne” do konkretnej klasy instanciate! Tak więc każdy alias (jak opisano powyżej) musi również (!) Mieć odpowiednie powiązanie (!) Od "abstrakcji" konkretnej klasy, która ma zostać zainicjowana.

Wnioski

W efekcie, jak napisano powyżej, istnieją thre aliasy (z konkretnych klas i interfejsów) do klucza/abstrakcyjnego „URL”. Ale nie mają one nic wspólnego z procesem inicjowania. Aby alias działał, musi również być prawdziwie wiążący!

W efekcie "aliasy kontenerów" umożliwiają dostęp do istniejącego powiązania z innymi klasami lub nazwami interfejsów.

  1. Jeśli zadzwonisz Container::make() z którymkolwiek z aliasów, laravel postara się rozwiązać je do „abstrakcyjnego” (tutaj „URL”).
  2. A następnie w drugim kroku, ten abstrakcyjny "adres URL" jest następnie próbowany do rozstrzygnięcia w odniesieniu do wiązań (co jest czymś zupełnie innym).
  3. Jeśli dla aliasu nie zostanie znalezione żadne powiązanie, zostanie zgłoszony błąd.

Możesz więc mieć dowolną liczbę aliasów, ale tylko jedno wiązanie i musisz mieć to pojedyncze wiązanie (dodatkowo!).

(Interesujące, jeśli zamapujesz alias na tę samą klasę co powiązanie, wydaje się, że kończy się on błędem rekursji, ale może to być również problem związany z xdebug).

+0

Myślałem o tym przez wiele dni ... właśnie zobaczyłem ten post. Dziękuję bardzo, jesteś świetny! –