Спрощення масивів конфігурації в Laravel за допомогою Config::collection()

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 19 вересня, 2025
Laravel 12 внесла зміни в роботу з масивами конфігурацій, спростивши їх обробку за допомогою нового методу `Config::collection()`. Дізнайтеся, як ця зміна може покращити вашу продуктивність розробника в нашій статті

У Laravel 12 змінили підхід до роботи з конфігураційними масивами. Тепер метод Config::collection() повертає масиви безпосередньо як екземпляри Collection, без необхідності обгортати їх у collect().

Раніше потрібно було виконувати два окремі виклики:

$services = collect(Config::array('services'));
$connections = collect(Config::array('database.connections'));

Новий метод усуває цю зайву дію:

$services = Config::collection('services');
$connections = Config::collection('database.connections');

Це відповідає іншим типізованим конфігураційним методам Laravel, таким як Config::string() та Config::integer(). Хоча різниця невелика, вона суттєва при регулярній роботі з конфігураційними масивами.

Ось система сповіщень, яка обробляє різні конфігурації служб:

<?php

namespace App\Services;

use Illuminate\Support\Facades\Config;

class NotificationManager
{
    public function getActiveChannels(): array
    {
        return Config::collection('notifications.channels')
            ->filter(fn($config) => $config['active'] === true)
            ->keys()
            ->toArray();
    }

    public function getChannelSettings(): array
    {
        return Config::collection('notifications.channels')
            ->mapWithKeys(fn($config, $name) => [$name => $config['settings'] ?? []])
            ->toArray();
    }

    public function validateChannelConfigs(): array
    {
        $problems = [];

        Config::collection('notifications.channels')->each(function($config, $name) use (&$problems) {
            if (empty($config['driver'])) {
                $problems[] = "Канал '{$name}' не має драйвера";
            }
            if (empty($config['webhook_url']) && $config['driver'] === 'webhook') {
                $problems[] = "Канал '{$name}' потребує URL вебхука";
            }
        });

        return $problems;
    }
}

class CacheManager
{
    public function getRedisConnections(): array
    {
        return Config::collection('cache.stores')
            ->filter(fn($config) => $config['driver'] === 'redis')
            ->keys()
            ->toArray();
    }

    public function getStoresByType(): array
    {
        return Config::collection('cache.stores')
            ->groupBy('driver')
            ->map(fn($group) => $group->keys()->toArray())
            ->toArray();
    }
}

Цей метод добре працює, коли ваші конфігураційні файли містять масиви структурованих даних. Ось типовий конфігураційний файл, що виграє від використання методів колекцій:

return [
    'payment_providers' => [
        'stripe' => ['active' => true, 'test_mode' => false],
        'paypal' => ['active' => false, 'test_mode' => true],
        'square' => ['active' => true, 'test_mode' => true],
    ],
    'email_services' => [
        'ses' => ['active' => true, 'region' => 'us-east-1'],
        'mailgun' => ['active' => false, 'domain' => 'example.com'],
        'postmark' => ['active' => true, 'token' => 'abc123'],
    ],
];

class PaymentService
{
    public function getLiveProviders(): array
    {
        return Config::collection('services.payment_providers')
            ->filter(fn($config) => $config['active'] && !$config['test_mode'])
            ->keys()
            ->toArray();
    }

    public function countActiveProviders(): int
    {
        return Config::collection('services.payment_providers')
            ->filter(fn($config) => $config['active'])
            ->count();
    }
}

Ця зміна дозволяє уникнути необхідності пам'ятати про обгортання конфігураційних масивів у collect(). Це невелике, але важливе покращення, яке робить обробку конфігурацій більш зручною.