Yii opiera się na mechanizmie automatycznego ładowania klas służącym do
zlokalizowania i dołączenia wszystkich wymaganych plików klas. Wbudowany wysoce wydajny autoloader klas, zgodny ze
standardem PSR-4, jest instalowany po załączeniu
pliku Yii.php
.
Uwaga: Dla uproszczenia opisów, w tej sekcji zostanie omówione jedynie autoładowanie klas. Należy mieć jednak na uwadze, że poniższe informacje odnoszą się również do autoładowania interfejsów i traitów.
Aby skorzystać z autoloadera klas Yii, powinieneś przestrzegać dwóch prostych zasad tworzenia i nazywania własnych klas:
foo\bar\MyClass
)// $className jest w pełni uściśloną nazwą klasy bez początkowego odwrotnego ukośnika
$classFile = Yii::getAlias('@' . str_replace('\\', '/', $className) . '.php');
Przykładowo, jeśli nazwa klasy i przestrzeń nazw to foo\bar\MyClass
, odpowiadającym ścieżce pliku klasy aliasem
jest @foo/bar/MyClass.php
. Aby ten alias mógł być przetłumaczony na ścieżkę pliku, @foo
lub @foo/bar
musi być
aliasem bazowym.
Używając podstawowego szablonu projektu, możesz umieścić swoje klasy w bazowej przestrzeni nazw app
, dzięki
czemu mogą być autoładowane przez Yii bez potrzeby definiowania nowego aliasu. Dzieje się tak dzięki temu, że @app
jest
predefiniowanym aliasem i klasa app\components\MyClass
może być odszukana w pliku
AppBasePath/components/MyClass.php
, zgodnie z opisanym algorytmem.
W zaawansowanym szablonie projektu każdy poziom
aplikacji posiada swój własny bazowy alias. Dla przykładu, front-end określony jest przez bazowy alias @frontend
, a back-end -
@backend
. Dzięki temu możesz umieścić klasy front-endu w przestrzeni nazw frontend
, a klasy back-endu w przestrzeni nazw backend
.
Wszystkie te klasy będą automatycznie załadowane przez autoloader Yii.
Autoloader klas Yii wspiera mechanizm mapy klas, która mapuje nazwy klas do odpowiadających im ścieżek plików. Kiedy autoloader ładuje klasę, najpierw sprawdza czy klasa znajduje się w mapie. Jeśli tak, odpowiadająca nazwie ścieżka pliku zostanie dołączona od razu, bez dalszej weryfikacji, co jest powodem, dla którego autoładowanie klas jest błyskawiczne. Wszystkie podstawowe klasy Yii są autoładowane właśnie w ten sposób.
Możesz dodać klasę do mapy klas, przechowywanej w Yii::$classMap
, za pomocą instrukcji:
Yii::$classMap['foo\bar\MyClass'] = 'path/to/MyClass.php';
Do określenia ścieżek plików klas można użyć aliasów. Zapisywanie mapy klas powinno odbywać się w procesie bootstrappingu, aby mapa była gotowa zanim rozpocznie się korzystanie z klas.
Ponieważ Yii opiera się głównie na composerze, jako menedżerze pakietów zależności, zalecane jest również zainstalowanie autoloadera composera. Jeśli używasz zewnętrznych bibliotek, korzystających z własnych autoloaderów, powinieneś również je zainstalować.
Używając autoloadera Yii razem z innymi autoloaderami, powinieneś dołączyć plik Yii.php
po wszystkich pozostałych autoloaderach. Dzięki temu
autoloader Yii jako pierwszy odpowie na żądanie autoładowania klasy. Dla przykładu, poniższy kod znajduje się
w skrypcie wejściowym podstawowego szablonu projektu. Pierwsza linia jest
instrukcją instalacji autoloadera composera, a druga instaluje autoloader Yii:
require __DIR__ . '/../vendor/autoload.php';
require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php';
Możesz używać jedynie autoloadera composera bez autoloadera Yii, ale wydajność autoładowania klas może być wtedy obniżona i, dodatkowo, musisz przestrzegać zasad ustalonych przez composera, aby Twoje klasy mogły być autoładowane.
Informacja: Jeśli nie chcesz korzystać z autoloadera Yii, musisz stworzyć swoją własną wersję pliku
Yii.php
i dołączyć ją w skrypcie wejściowym.
Autoloader Yii potrafi również automatycznie ładować klasy rozszerzeń. Jedynym wymaganiem ze strony
rozszerzenia jest prawidłowy zapis sekcji autoload
w swoim pliku composer.json
. Szczegóły na temat specyfikacji autoload
znajdują
się dokumentacji composera.
Jeśli nie korzystasz z autoloadera Yii, autoloader composera załaduje dla Ciebie automatycznie klasy rozszerzeń.
Found a typo or you think this page needs improvement?
Edit it on github !
Signup or Login in order to comment.