Загрузка...

Laravel Package Discovery

Как Laravel сам находит и подключает пакеты (и почему это вообще удобно)
laravel cover

Если ты давно работаешь с Laravel, то наверняка ловил себя на мысли: “А почему мне больше не нужно вручную регистрировать сервис-провайдеры?” Раньше ведь без этого ни один пакет нормально не заводился.

Так вот — это не магия. Это Laravel Package Discovery. И сейчас разберёмся, как оно работает, где помогает, а где может выстрелить в ногу.


Что такое Laravel Package Discovery

Package Discovery — это механизм, который автоматически регистрирует сервис-провайдеры и алиасы пакетов, установленных через Composer.

Проще говоря:

Ты ставишь пакет → Laravel сам его подключает → ты сразу можешь им пользоваться.

Без вот этого старого доброго:

'providers' => [
    SomePackageServiceProvider::class,
],

Как это работает под капотом

Вся магия начинается в composer.json самого пакета. Там есть секция:

"extra": {
    "laravel": {
        "providers": [
            "VendorPackageServiceProvider"
        ],
        "aliases": {
            "SomeAlias": "VendorPackageFacade"
        }
    }
}

Когда ты устанавливаешь пакет:

composer require vendor/package

Composer триггерит скрипт:

php artisan package:discover

Laravel:

  1. Сканирует все установленные пакеты
  2. Ищет extra.laravel
  3. Собирает список провайдеров
  4. Кэширует всё это добро в:
bootstrap/cache/packages.php

Где хранится результат

Laravel не делает это каждый раз на лету (иначе было бы больно по производительности).

Он сохраняет результат в файл:

bootstrap/cache/packages.php

Пример содержимого:

return [
    'vendor/package' => [
        'providers' => [
            'VendorPackageServiceProvider',
        ],
        'aliases' => [],
    ],
];

И уже оттуда всё грузится при запуске приложения.


Когда выполняется discovery

Вот ключевые моменты:

  • при composer install
  • при composer update
  • при composer dump-autoload
  • вручную:
php artisan package:discover

Почему это удобно

1. Минус рутина

Раньше:

  • поставил пакет
  • открыл config/app.php
  • добавил провайдер
  • добавил алиас
  • не забыл ничего? (обычно забывал)

Сейчас:

  • поставил пакет
  • всё работает

2. Меньше ошибок

Нет ручной регистрации → меньше шансов забыть или опечататься.

3. Унифицированный подход

Все пакеты подключаются одинаково. Нет “особенных снежинок”.


Но есть нюансы (и вот тут начинается жизнь)

1. Не всегда нужно автоподключение

Иногда пакет ты хочешь:

  • подключать только в dev
  • включать условно
  • контролировать порядок загрузки

А discovery просто берёт и регистрирует всё подряд.


2. Как отключить package discovery

В composer.json проекта:

"extra": {
    "laravel": {
        "dont-discover": [
            "vendor/package"
        ]
    }
}

Или вообще всё:

"dont-discover": [
    "*"
]

После этого — руками:

'providers' => [
    VendorPackageServiceProvider::class,
],

3. Кэш может мешать

Иногда ловишь классическую ситуацию:

“Я всё сделал, но ничего не работает”

Проблема часто в кэше.

Решение:

php artisan package:discover --ansi
php artisan config:clear
php artisan cache:clear

Практический пример: свой пакет

Допустим, ты пишешь свой Laravel-пакет.

Шаг 1. Добавляешь в composer.json

"extra": {
    "laravel": {
        "providers": [
            "AcmeDemoDemoServiceProvider"
        ]
    }
}

Шаг 2. Публикуешь пакет

Пользователь делает:

composer require acme/demo

И всё — провайдер уже подключён.

Без документации типа:

“Не забудьте добавить в config/app.php…”


Что происходит внутри Laravel

Если копнуть чуть глубже:

  • класс PackageManifest
  • читает vendor/composer/installed.json
  • вытаскивает extra.laravel
  • формирует массив
  • пишет в cache

Это важный момент:

Discovery — это не runtime-магия, это сгенерированный кэш.


Когда лучше НЕ использовать discovery

Вот реальные кейсы, где лучше отключить:

1. Большие enterprise-проекты

Где важен контроль:

  • порядок загрузки
  • зависимости между пакетами

2. Условная загрузка

Например:

if ($this->app->environment('local')) {
    // только для dev
}

3. Debugging

Иногда проще понять, что происходит, когда всё подключено явно.


Частые ошибки

❌ Пакет не подключился

Проверь:

  • есть ли extra.laravel
  • есть ли провайдер
  • выполнен ли package:discover

❌ Изменения не применяются

Скорее всего:

  • кэш не обновился
  • забыл dump-autoload

❌ Конфликты провайдеров

Редко, но бывает:

  • два пакета делают одно и то же
  • конфликт биндингов

Итог

Laravel Package Discovery — это одна из тех вещей, которые делают Laravel “приятным” фреймворком.

Он:

  • убирает рутину
  • делает установку пакетов мгновенной
  • снижает количество ошибок

Но:

Как и любая автоматизация — иногда мешает, если тебе нужен контроль.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *