Рубрики
Uncategorized

Интерпретация механизма автоматического обнаружения пакетов в laravel

Автор оригинала: David Wong.

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