7.9 KiB
Автозавантаження класів
Пошук і підключення файлів класів в Yii реалізовано за допомогою
автозавантаження класів. Фреймворк надає свій швидкий сумісний з PSR-4
автозавантажувач, який встановлюється в момент підключення Yii.php.
Примітка: Для простоти оповіді, в цьому розділі ми будемо говорити тільки про автозавантаження класів. Тим не менш, все описане застосовно до інтерфейсів і трейтам.
Як використовувати автозавантажувач Yii
При використанні автозавантажувач класів Yii слід дотримуватися два простих правила створення і іменування класів:
- Кожен клас повинен належати простору імен (тобто
foo\bar\MyClass). - Кожен клас повинен знаходитися в окремому файлі, шлях до якого визначаться наступним правилом:
// $className — це абсолютне ім'я класу, що починається з "\"
$classFile = Yii::getAlias('@' . str_replace('\\', '/', $className) . '.php');
Наприклад, якщо абсолютне ім'я класу foo\bar\MyClass, то псевдонім шляху даного файлу буде
@foo/bar/MyClass.php. Для того, щоб даний псевдонім можна було перетворити в шлях до файлу, необхідно щоб або @foo або @foo/bar був кореневим псевдонімом.
При использовании шаблона приложения basic вы можете хранить свои классы в пространстве имён app.
В этом случае они будут загружаться автоматически без создания нового псевдонима. Это работает потому как @app
является заранее определённым псевдонимом и такое имя класса как
app\components\MyClass в соответствии с описанным выше алготимом преобразуется в путь
директорияПриложения/components/MyClass.php.
В шаблоне приложения advanced каждый уровень приложения обладает собственным корневым
псевдонимом. Например, для frontend корневым псевдонимом является @frontend, а для backend — @backend. Это позволяет
разместить классы frontend в пространство имён frontend, а классы backend в пространство имён backend. При этом
классы будут загружены автоматически.
Карта классов
Автозагрузчик Yii поддерживает карту классов. Эта возможность позволяет указать путь к файлу для каждого имени класса. При загрузке класса автозагрузчик проверяет наличие класса в карте. Если он там есть, соответствующий файл будет загружен напрямую без каких-либо дополнительных проверок. Это делает автозагрузку очень быстрой. Все классы самого фреймворка загружаются именно этим способом.
Вы можете добавить класс в карту Yii::$classMap следующим образом:
Yii::$classMap['foo\bar\MyClass'] = 'path/to/MyClass.php';
Для указания путей к файлам классов можно использовать псевдонимы. Карту классов необходимо сформировать в процессе первоначальной загрузки так как она должна быть готова до использования классов.
Использование других автозагрузчиков
Так как Yii использует Composer в качестве менеджера зависимостей, рекомендуется дополнительно установить его автозагрузчик. Если вы используете какие-либо сторонние библиотеки, в которых есть свои автозагрузчики, эти автозагрузчики также необходимо установить.
При использовании дополнительных автозагрузчиков файл Yii.php должен быть подключен после их установки. Это позволит
автозагрузчику Yii первым пробовать загрузить класс. К примеру, приведённый ниже код взят из
входного скрипта шаблона приложения basic. Первая строка устанавливает
автозагрузчик Composer, а вторая — автозагрузчик Yii:
require(__DIR__ . '/../vendor/autoload.php');
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');
Вы можете использовать автозагрузчик Composer без автозагрузчика Yii. Однако, скорость автозагрузки в этом случае может уменьшится. Также вам будет необходимо сдедовать правилам автозагрузчика Composer.
Информация: Если вы не хотите использовать автозагрузчик Yii, создайте свою версию файла
Yii.phpи подключите его в входном скрипте.
Автозагрузка классов расширений
Автозагрузчик Yii может автоматически загружать классы расширений в том случае, если соблюдается единственное правило. Расширение должно правильно описать раздел 'autoload' в файле 'composer.json'. Более подробно об этом можно узнать из официальной документации Composer.
Если вы не используете автозагрузчик Yii, то классы расширений могут быть автоматически загружены с помощью автозагрузчика Composer.