Статья была переслана из профессионального сообщества разработчиков 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 загрузится перед попыткой загрузки любых других поставщиков услуг.