Если ты давно работаешь с 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:
- Сканирует все установленные пакеты
- Ищет
extra.laravel - Собирает список провайдеров
- Кэширует всё это добро в:
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 “приятным” фреймворком.
Он:
- убирает рутину
- делает установку пакетов мгновенной
- снижает количество ошибок
Но:
Как и любая автоматизация — иногда мешает, если тебе нужен контроль.