Порівняйте ключі колекцій за допомогою методу diffKeys у Laravel

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 30 травня, 2025
Метод diffKeys у системі колекцій Laravel дозволяє виявляти різниці між колекціями на основі їхніх ключів, що робить його надзвичайно корисним для завдань управління конфігурацією та контролю доступу. Чи знаєте ви, як ця функція може спростити вашу роботу? Читайте далі, щоб дізнатися більше про її практичне використання

Система колекцій Laravel пропонує метод diffKeys, який дозволяє виявляти відмінності між колекціями за ключами, а не за значеннями. Це забезпечує точне порівняння та управління конфігураціями.

Метод diffKeys порівнює колекції, аналізуючи їх ключі:

$collection = collect([
    'one' => 10,
    'two' => 20,
    'three' => 30,
    'four' => 40,
    'five' => 50,
]);
 
$diff = $collection->diffKeys([
    'two' => 2,
    'four' => 4,
    'six' => 6,
]);
// Результат: ['one' => 10, 'three' => 30, 'five' => 50]

Цей метод є особливо корисним у системах управління налаштуваннями:

class SettingsManager
{
    public function findDeprecatedSettings(array $currentSettings, array $supportedSettings)
    {
        return collect($currentSettings)
            ->diffKeys($supportedSettings)
            ->map(function ($value, $key) {
                return [
                    'setting' => $key,
                    'current_value' => $value,
                    'deprecated_at' => now()
                ];
            });
    }
 
    public function validateEssentialKeys(array $settings)
    {
        $essential = [
            'app_name' => null,
            'environment' => null,
            'debug_mode' => null
        ];
 
        $missing = collect($essential)
            ->diffKeys($settings)
            ->keys();
 
        if ($missing->isNotEmpty()) {
            throw new MissingSettingsException(
                'Відсутні основні налаштування: ' .
                $missing->implode(', ')
            );
        }
 
        return true;
    }
 
    public function compareEnvironments(array $production, array $staging)
    {
        $prodOnly = collect($production)->diffKeys($staging);
        $stagingOnly = collect($staging)->diffKeys($production);
 
        return [
            'production_only' => $prodOnly->all(),
            'staging_only' => $stagingOnly->all(),
            'total_differences' => $prodOnly->count() + $stagingOnly->count()
        ];
    }
}

Метод також є важливим при управлінні правами доступу:

class PermissionManager
{
    public function findRevokedPermissions(array $previousPerms, array $currentPerms)
    {
        return collect($previousPerms)
            ->diffKeys($currentPerms)
            ->map(function ($granted, $permission) {
                return [
                    'permission' => $permission,
                    'was_granted' => $granted,
                    'revoked_at' => now()
                ];
            });
    }
 
    public function validateUserAccess(array $userPermissions, array $requiredAccess)
    {
        $missingAccess = collect($requiredAccess)
            ->diffKeys($userPermissions)
            ->keys();
 
        return [
            'has_access' => $missingAccess->isEmpty(),
            'missing_permissions' => $missingAccess->all()
        ];
    }
 
    public function auditPermissionChanges(array $before, array $after)
    {
        $added = collect($after)->diffKeys($before);
        $removed = collect($before)->diffKeys($after);
 
        return [
            'permissions_added' => $added->keys()->all(),
            'permissions_removed' => $removed->keys()->all(),
            'change_summary' => [
                'additions' => $added->count(),
                'removals' => $removed->count()
            ]
        ];
    }
}

Для управління функціональними флагами:

class FeatureFlagService
{
    public function syncFeatureFlags(array $serverFlags, array $clientFlags)
    {
        $serverOnly = collect($serverFlags)->diffKeys($clientFlags);
        $clientOnly = collect($clientFlags)->diffKeys($serverFlags);
 
        return [
            'flags_to_add' => $serverOnly->all(),
            'flags_to_remove' => $clientOnly->keys()->all(),
            'sync_required' => $serverOnly->isNotEmpty() || $clientOnly->isNotEmpty()
        ];
    }
 
    public function validateFeatureAccess(array $userFlags, array $requiredFeatures)
    {
        $unavailable = collect($requiredFeatures)
            ->diffKeys($userFlags)
            ->keys();
 
        if ($unavailable->isNotEmpty()) {
            throw new FeatureAccessException(
                'Доступ до функцій заборонено: ' . $unavailable->implode(', ')
            );
        }
 
        return true;
    }
}

Метод diffKeys спрощує завдання порівняння за ключами, зосереджуючи увагу на структурних відмінностях, що робить його ідеальним для перевірки конфігурацій, аудиту прав доступу та синхронізації