Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Laravel - klasy w namespace np. Illuminate\Support\Facades a jednak łatwy dostęp przez nazwę klasy
konrados
post 9.06.2015, 16:09:49
Post #1





Grupa: Zarejestrowani
Postów: 623
Pomógł: 79
Dołączył: 16.01.2008

Ostrzeżenie: (0%)
-----


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.

Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
Pyton_000
post 9.06.2015, 16:23:08
Post #2





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


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

Go to the top of the page
+Quote Post
konrados
post 9.06.2015, 16:42:47
Post #3





Grupa: Zarejestrowani
Postów: 623
Pomógł: 79
Dołączył: 16.01.2008

Ostrzeżenie: (0%)
-----


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?

Go to the top of the page
+Quote Post
Pyton_000
post 9.06.2015, 16:57:18
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
konrados
post 9.06.2015, 16:59:37
Post #5





Grupa: Zarejestrowani
Postów: 623
Pomógł: 79
Dołączył: 16.01.2008

Ostrzeżenie: (0%)
-----


OK, dzięki!
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 20:49