Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Laravel - klasy w namespace np. Illuminate\Support\Facades a jednak łatwy dostęp przez nazwę klasy
Forum PHP.pl > Forum > Przedszkole
konrados
Hej,

Piszę swój własny mini-framework (wiem, wiem, głupota:))

Mimo, że ma być mini-mini, to chciałbym by był zgodny z najnowszymi trendami.

Aktualnie analizuję Laravel, który robi furrorę od jakichś dwóch lat.

I w nim nie rozumiem jednej rzeczy. Podobnie jak i tam, chciałbym aby dostęp do klas frameworka był jak najprostszy, czyli, mimo używania namespaców, by do tych podstawowych klas (jak App, Input, Form) dostęp był jedynie poprzez użycie samej nazwy klasy, np:

  1. $x=new Form();


Laravel to osiągnął. Po długiej analizie, widzę, że robi to poprzez funkcję php class_alias, np. mamy taki array w configu aplikacji:


  1. 'aliases' => [
  2.  
  3. 'App' => 'Illuminate\Support\Facades\App',
  4. 'Artisan' => 'Illuminate\Support\Facades\Artisan',
  5. 'Auth' => 'Illuminate\Support\Facades\Auth',
  6. (...)


I ten array jest użyty do zbudowania aliasów.

Klasa 'App' zaczyna się w ten sposób:

  1. namespace Illuminate\Support\Facades;
  2.  
  3. /**
  4.  * @see \Illuminate\Foundation\Application
  5.  */
  6. class App extends Facade {
  7. (...)


I teraz to do czego nie mogę dojść, to to, że przecież ta klasa mieści się w katalogu:
vendor\laravel\framework\src\Illuminate\Support\Facades\App.php

Czyli katalog jest inny, niż wskazywałby na to namespace.

W jaki sposób to działa, że mimo wszystko jest załadowana właściwa klasa? Analiza całego kodu chyba mi z tydzień zajmie, a może ktoś wie... Szukałem w całym projekcie funkcji __autoload oraz spl_autoload_register ale to wszystko jest strasznie zawiłe.

Pyton_000
Autoloader jest użyty z Composer.
Zerknij w vendor/composer/autoload_psr4.php
Tam będziesz miał ustalone namespace.

konrados
O, dzięki, szczerze mówiąc nie spodziewałem się odpowiedzi:)

Ale widzę, że to jest dużo bardziej skomplikowane, niż na początku sądziłem... np. po co jest plik autoload_classmap.php w katalogu vendor/composer - gdzie, jak widzę, jest właściwie każda klasa używana w projekcie, zarówno klasy z samego frameworka jak i projektu (z katalogu App) - no to po co są namespacy z dokładną ścieżką, jak i tak mamy to mapowanie każdej klasy do ścieżki...

Aha - i w tym pliku vendor/composer/autoload_psr4.php jest napisane "// autoload_psr4.php @generated by Composer" - jak się zmusza composera by nam dodał tam nowy alias dla namespaca?

Pyton_000
composer dump-autoload
To polecenie aktualizuje Autoloader o nowe wpisy.

Poczytaj lepiej o namespace i PSR-4 i PSR-0 to Ci może rozjaśni.
konrados
OK, dzięki!
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.