Система колекцій 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 спрощує завдання порівняння за ключами, зосереджуючи увагу на структурних відмінностях, що робить його ідеальним для перевірки конфігурацій, аудиту прав доступу та синхронізації