Пакет має працювати одразу після встановлення з розумними значеннями за замовчуванням, але дозволяти змінити їх застосунку.
mergeConfigFrom (у register) - злиття конфігурації пакета з конфігурацією застосунку:
public function register(): void
{
$this->mergeConfigFrom(__DIR__.'/../config/invoices.php', 'invoices');
}
Тепер config('invoices.currency') працює, навіть якщо застосунок нічого не публікував.
publishes (у boot) - дозволяє скопіювати файл у застосунок для редагування:
public function boot(): void
{
$this->publishes([
__DIR__.'/../config/invoices.php' => config_path('invoices.php'),
], 'invoices-config');
}
php artisan vendor:publish --tag=invoices-config
Як працює злиття - і головна пастка:
// всередині mergeConfigFrom
array_merge(require $packageConfig, config('invoices', []));
- значення застосунку перемагають значення пакета;
- злиття неглибоке - лише перший рівень ключів. Якщо пакет має
'pdf' => ['size' => 'A4', 'orientation' => 'portrait'], а застосунок у своєму файлі вказав'pdf' => ['size' => 'Letter'], ключorientationзникне повністю; - для рекурсивного злиття є
replaceConfigRecursivelyFrom(), але воно має свої наслідки для масивів-списків.
Звідси правило проєктування конфігурації пакета: тримати її пласкою, а вкладені групи - мінімальними, і документувати, що опублікований файл замінює групу цілком.
config:cache: коли конфігурацію закешовано, mergeConfigFrom нічого не робить - значення вже в кеші. Тому змінюючи конфігурацію пакета в розробці, не забувайте config:clear.
Теги публікації:
- конвенція -
<пакет>-config,<пакет>-migrations,<пакет>-views; vendor:publish --provider="Acme\Invoices\InvoicesServiceProvider"публікує все від провайдера;- міграції краще публікувати через
publishesMigrations()- Laravel оновить мітку часу в імені файлу, щоб міграція виконалася після наявних; - не змушуйте публікувати конфігурацію для базової роботи: якщо без
vendor:publishпакет падає - це погана інтеграція.
Значення з оточення: у конфігурації пакета можна використовувати env('INVOICES_CURRENCY', 'UAH'), а в коді пакета - лише config(), бо після config:cache виклики env() поза конфігураційними файлами повертають null.