Laravel-пакет - це звичайний Composer-пакет, який інтегрується з фреймворком через сервіс-провайдер. Мінімальна структура:
acme/laravel-invoices/
├── composer.json
├── config/invoices.php
├── src/
│ ├── InvoicesServiceProvider.php
│ ├── InvoiceGenerator.php
│ └── Facades/Invoices.php
├── database/migrations/
├── resources/views/
└── tests/
Сервіс-провайдер - точка входу: реєструє класи в контейнері (register) і підключає конфігурацію, маршрути, представлення, міграції, команди (boot).
class InvoicesServiceProvider extends ServiceProvider
{
public function register(): void
{
$this->mergeConfigFrom(__DIR__.'/../config/invoices.php', 'invoices');
$this->app->singleton(InvoiceGenerator::class);
}
public function boot(): void
{
$this->loadViewsFrom(__DIR__.'/../resources/views', 'invoices');
}
}
Автоматичне виявлення (package discovery): провайдер і фасади описуються в composer.json пакета:
{
"name": "acme/laravel-invoices",
"autoload": {
"psr-4": { "Acme\\Invoices\\": "src/" }
},
"extra": {
"laravel": {
"providers": ["Acme\\Invoices\\InvoicesServiceProvider"],
"aliases": { "Invoices": "Acme\\Invoices\\Facades\\Invoices" }
}
}
}
Після composer require скрипт php artisan package:discover (Laravel запускає його в post-autoload-dump) читає секції extra.laravel усіх встановлених пакетів і записує список у bootstrap/cache/packages.php. Користувачу не треба нічого додавати в bootstrap/providers.php.
Як вимкнути виявлення - у composer.json застосунку:
"extra": {
"laravel": {
"dont-discover": ["barryvdh/laravel-debugbar"]
}
}
Наприклад, щоб підключати налагоджувальний пакет лише в локальному середовищі через власний провайдер.
Якщо пакет «не підхопився»: перевірити bootstrap/cache/packages.php, виконати php artisan package:discover і переконатися, що composer install не запускався з --no-scripts (тоді discover не виконується).
Залежності пакета: вимагати лише ті компоненти, які використовуються (illuminate/support, illuminate/database), а не весь laravel/framework - так пакет легше встановити й у застосунки на компонентах Laravel.