Статья была переслана из профессионального сообщества разработчиков laravel. Оригинальная ссылка: https://learnku.com/laravel/t
Прежде чем мы перейдем к изучению того, как поставщик и фасад пакета laravel автоматически обнаруживаются, давайте кратко рассмотрим концепцию пакета в PHP.
Пакет-это фрагмент кода, который может быть повторно использован в нескольких проектах. Например, пакет spatial/laravel analytics позволяет простым способом извлекать данные из Google Analytics в проектах laravel. Пакет размещен на GitHub и поддерживается spatial. Они будут продолжать публиковать, обновлять и исправлять ошибку пакета, если вы используете этот пакет в своем проекте, вам не нужно беспокоиться об использовании composer для копирования нового кода с GitHub, если вы хотите получить эти обновления и исправления после их выпуска.
Composer-это инструмент управления зависимостями PHP. Это позволяет объявлять зависимости библиотеки проекта и управлять ими (устанавливать/обновлять). –Видишь getcomposer.org
Принесено laravel composer.json Документ, в документе требуется Или требуется-dev Под пунктом указан пакет, необходимый для расширения функции приложения обновление композитора :
{
"require": {
"spatie/laravel-analytics": "3.*",
},
}Вы также можете использовать следующую команду для достижения того же эффекта
composer require spatie/laravel-analytics
Что делает composer, так это извлекает нужный вам пакет версий и загружает его в каталог поставщик . После выполнения вышеуказанной команды все классы и файлы в пакете загружаются в проект, и вы можете использовать их немедленно. Каждый раз , когда вы выполняете их снова обновление composer , composer извлекает пакет обновлений и автоматически обновляет пакет, расположенный в файлах вашего проекта поставщика в каталоге.
Для использования определенных пакетов laravel в проекте laravel требуются следующие дополнительные шаги
- Зарегистрировать поставщика услуг
- Зарегистрируйте псевдоним/фасад
- Ресурсы для публикации
Если вы прочтете инструкции по установке пакета spatie, вы обнаружите, что перед переходом к следующему шагу конфигурация проекта должна зарегистрировать поставщика услуг и фасад, что является хорошей привычкой. Этот шаг определен Тейлором Отвеллом, что является просто ненужным условием, Дрисвинтс, и всякий раз, когда вы решаете ввести новый пакет или удалить пакет, как поставщик услуг, так и фасад могут быть автоматически обнаружены.
Просмотрите заявление Тейлора о новой функции в средствах массовой информации
Что такое поставщик услуг и фасад?
Поставщик услуг отвечает за привязку объектов к контейнеру услуг laravel и информирование laravel о том, где загружать ресурсы пакета, такие как представления, файлы конфигурации и локализации. –Laravel.com документация
Вы можете прочитать больше о поставщиках услуг в официальном документе
Фасад обеспечивает “статический” интерфейс для классов, доступных в контейнере службы приложений — laravel.com документ
Подробнее о фасаде вы можете прочитать в официальных документах
Когда вы находите и устанавливаете/обновляете различные пакеты расширений, composer запускает несколько событий, на которые вы можете подписаться, и запускает свой собственный фрагмент кода или даже исполняемый файл командной строки. Одно из интересных событий называется после автоматической загрузки-дамп . Запускается непосредственно после того, как composer генерирует окончательный список автоматически загружаемых классов в проекте. В настоящее время laravel имеет доступ ко всем классам, и приложение готово использовать все классы пакетов, загруженные в него.
Laravel подписывается на это событие в основном файле composer.json:
"scripts": {
"post-autoload-dump": [
"Illuminate\Foundation\ComposerScripts::postAutoloadDump",
"@php artisan package:discover"
]
}Сначала он вызывает post Autoload Dump() Статический метод, который очищает кэшированные службы или ранее обнаруженные пакеты. Другое заключается в том, что он запускает команду package:discover Artisan, которая заключается в том, что laravel может автоматически обнаруживать секреты.
Автоматическое обнаружение пакетов
Осветить\Основание\Консоль\Команда обнаружения пакета остаться Осветите\Foundation\Манифест пакета Вызов в классе build() Метод, в котором laravel находит установленные пакеты.
Манифест пакета Ранняя регистрация загрузчика приложения в контейнер, полностью из Осветите\Foundation\Application::registerBaseServiceProviders()
В методе build() laravel ищет поставщик/композитор/установленный.json Файл, который создается композитором и содержит полное сопоставление, включая содержимое файла composer.json , laravel сопоставляет содержимое файла и ищет дополнительный.laravel Частичный пакет:
"extra": {
"laravel": {
"providers": [
"Barryvdh\Debugbar\ServiceProvider"
],
"aliases": {
"Debugbar": "Barryvdh\Debugbar\Facade"
}
}
}Сначала он собирает содержимое этого раздела, а затем просматривает основной composer.json В разделе файл extra.laravel.dont-discover , чтобы узнать, решили ли вы не обнаруживать автоматически некоторые или все ваши пакеты:
"extra": {
"laravel": {
"dont-discover": [
"barryvdh/laravel-debugbar"
]
}
}Вы можете добавить * , чтобы указать laravel полностью прекратить автоматическую регистрацию.
Теперь laravel собрала информацию о пакете расширения
Да, как только он получит необходимую ему информацию, он будет bootstrap/cache/packages.php Напишите PHP-файл в:
array (
'providers' =>
array (
0 => 'Barryvdh\Debugbar\ServiceProvider',
),
'aliases' =>
array (
'Debugbar' => 'Barryvdh\Debugbar\Facade',
),
),
);Регистрация пакета
У Laravel есть два загрузчика, которые используются при запуске HTTP или консольного ядра:
\\Осветить\Фундамент\Начальная загрузка\Зарегистрировать фасады\Осветить\Основа\Начальная загрузка\Поставщики регистраторов
Сначала используйте Illuminate\Foundation\AliasLoader Загрузите весь фасад в приложение, и laravel теперь увидит packages.php Сгенерированный файл и извлеките все псевдонимы в пакете, которые вы хотите, чтобы laravel автоматически регистрировал и регистрировал. Его использование Манифест пакета::псевдонимы() Метод для сбора этой информации.
//In registerfaciades:: bootstrap()
AliasLoader::getInstance(array_merge(
$app->make('config')->get('app.aliases', []),
$app->make(PackageManifest::class)->aliases()
))->register();Как вы можете видеть, из config/app.php Псевдоним и ведомый для загрузки файла Манифест пакета Псевдонимы загруженного класса.
Аналогично, laravel регистрирует поставщика услуг при запуске, Регистрирует поставщиков Вызов загрузчика Foundation\Application Метода registerConfiguredProviders () , и laravel соберет всех поставщиков пакетов, которые должны быть зарегистрированы автоматически, и зарегистрирует их.
$providers = Collection::make($this->config['app.providers'])
->partition(function ($provider) {
return Str::startsWith($provider, 'Illuminate\');
});
$providers->splice(1, 0, [$this->make(PackageManifest::class)->providers()]);Здесь мы вводим автоматически обнаруженных поставщиков услуг между поставщиком услуг Illuminate и любыми другими поставщиками услуг, которые могут быть в вашем профиле, поэтому мы гарантируем, что вы можете переопределить поставщиков услуг пакета расширений, повторно зарегистрировав их в профиле, и компонент Illuminate загрузится перед попыткой загрузки любых других поставщиков услуг.