Laravel usprawnia walidację kolekcji, dodając obsługę domknięć do metody containsOneItem(), umożliwiając programistom sprawdzenie, czy dokładnie jeden element spełnia niestandardowe warunki, a nie tylko sprawdzanie rozmiaru kolekcji.
Wcześniej containsOneItem() mogła określić tylko, czy kolekcja zawierała dokładnie jeden element ogółem. Ulepszona metoda akceptuje teraz domknięcia, umożliwiając precyzyjną walidację, że dokładnie jeden element spełnia określone kryteria:
$collection = collect([1, 2, 3]);
$collection->containsOneItem(fn($item) => $item === 2); // true
$collection->containsOneItem(fn($item) => $item > 1); // false (2 and 3 match)
To ulepszenie okazuje się szczególnie cenne w scenariuszach walidacji reguł biznesowych:
class BusinessRuleValidator
{
public function validateTeamStructure(Collection $members)
{
// Ensure exactly one team lead exists
if (!$members->containsOneItem(fn($member) => $member->role === 'lead')) {
throw new ValidationException('Exactly one team lead required');
}
// Ensure exactly one budget approver
if (!$members->containsOneItem(fn($member) => $member->can_approve_budget)) {
throw new ValidationException('Exactly one budget approver required');
}
return true;
}
public function validateInvoiceItems(Collection $items)
{
$validations = [
'handling' => $items->containsOneItem(fn($item) => $item->type === 'handling'),
'processing' => $items->containsOneItem(fn($item) => $item->type === 'processing'),
'delivery' => $items->containsOneItem(fn($item) => $item->type === 'delivery')
];
foreach ($validations as $type => $isValid) {
if (!$isValid) {
throw new ValidationException("Exactly one {$type} fee required");
}
}
return $items;
}
}
Ulepszona metoda containsOneItem() zapewnia precyzyjną walidację kolekcji, zapewniając, że dokładnie jeden element spełnia określone warunki, dzięki czemu egzekwowanie reguł biznesowych jest bardziej niezawodne i wyraziste.