Усе підключається в методі boot сервіс-провайдера пакета:
public function boot(): void
{
$this->loadRoutesFrom(__DIR__.'/../routes/web.php');
$this->loadMigrationsFrom(__DIR__.'/../database/migrations');
$this->loadViewsFrom(__DIR__.'/../resources/views', 'invoices');
$this->loadTranslationsFrom(__DIR__.'/../lang', 'invoices');
$this->loadJsonTranslationsFrom(__DIR__.'/../lang');
if ($this->app->runningInConsole()) {
$this->commands([InstallCommand::class]);
}
}
Використання з простором імен пакета:
return view('invoices::pdf', ['invoice' => $invoice]);
__('invoices::messages.paid');
<x-invoices::status-badge :status="$invoice->status" />
Як застосунок перевизначає представлення без форку пакета: loadViewsFrom реєструє два шляхи - спершу resources/views/vendor/invoices застосунку, потім каталог пакета. Достатньо опублікувати чи створити файл з тим самим іменем:
$this->publishes([
__DIR__.'/../resources/views' => resource_path('views/vendor/invoices'),
], 'invoices-views');
Переклади працюють так само: файли в lang/vendor/invoices застосунку мають пріоритет.
Особливості кожного ресурсу:
| Ресурс | На що зважати |
|---|---|
| маршрути | loadRoutesFrom нічого не робить, якщо маршрути закешовано; дайте можливість вимкнути маршрути чи змінити префікс і middleware через конфігурацію |
| міграції | loadMigrationsFrom запускає міграції пакета разом з міграціями застосунку - зручно, але застосунок не може їх змінити. Альтернатива - лише публікація |
| представлення | ім'я простору - унікальне, щоб не зіткнутися з іншими пакетами |
| компоненти | Blade::componentNamespace('Acme\\Invoices\\Views', 'invoices') чи анонімні компоненти з каталогу представлень |
| команди | реєструвати лише в консолі - runningInConsole() |
Маршрути пакета - найбільша зона конфліктів: пакет, що безумовно реєструє /login чи /admin, може перекрити маршрути застосунку. Гарна практика:
if (config('invoices.routes.enabled', true)) {
Route::prefix(config('invoices.routes.prefix', 'invoices'))
->middleware(config('invoices.routes.middleware', ['web', 'auth']))
->group(__DIR__.'/../routes/web.php');
}
Міграції з моделями користувача: таблиці, що посилаються на users, мають враховувати, що модель користувача й тип ключа (int, UUID) у застосунку можуть бути іншими - краще брати їх із конфігурації.