System zbierania danych firmy Laravel udostępnia metodę diffKeys do identyfikowania różnic między kolekcjami na podstawie ich kluczy, a nie wartości, umożliwiając precyzyjne zadania związane z porównaniem i zarządzaniem konfiguracją.
Metoda diffKeys porównuje kolekcje, badając ich kluczowe struktury:
$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]
Ta metoda okazuje się szczególnie cenna w systemach zarządzania ustawieniami:
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()
];
}
}
Metoda doskonale sprawdza się w scenariuszach kontroli uprawnień i dostępu:
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()
]
];
}
}
Do zarządzania flagami funkcji:
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;
}
}
Metoda diffKeys usprawnia zadania porównawcze oparte na kluczach, koncentrując się na różnicach strukturalnych, a nie na porównaniach wartości, dzięki czemu idealnie nadaje się do walidacji konfiguracji, audytu uprawnień, i scenariusze synchronizacji.