• Час читання ~2 хв
  • 29.05.2025

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

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

$collection = collect([
    'one' => 10,
    'two' => 20,
    'three' => 30,
    'four' => 40,
    'five' => 50,
]);
$diff = $collection->diffKeys([
    'two' => 2,
    'four' => 4,
    'six' => 6,
]);
// Result: ['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(
                'Essential settings missing: ' .
                $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(
                'Access denied to features: ' . $unavailable->implode(', ')
            );
        }
        return true;
    }
}

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

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

Про мене

Professional Fullstack Developer with extensive experience in website and desktop application development. Proficient in a wide range of tools and technologies, including Bootstrap, Tailwind, HTML5, CSS3, PUG, JavaScript, Alpine.js, jQuery, PHP, MODX, and Node.js. Skilled in website development using Symfony, MODX, and Laravel. Experience: Contributed to the development and translation of MODX3 i...

Про автора CrazyBoy49z
WORK EXPERIENCE
Контакти
Ukraine, Lutsk
+380979856297

Ми знищуємо "шахеди" щодня. Щоразу — це врятовані життя. Але нам потрібна мобільність: бус або прицеп. Кожен донат = ще одна ніч під захистом.

🚐 Збір на бус для мого екіпажу, полк 1020 🎯 Ціль: 500 000 ₴
🔗 Посилання на банку 💳 4441 1111 2546 4663