Laravel улучшает валидацию коллекции, добавляя поддержку замыкания в метод containsOneItem(), что позволяет разработчикам проверять, что ровно один элемент удовлетворяет пользовательским условиям, а не просто проверять размер коллекции.
Ранее containsOneItem() мог определить, содержит ли коллекция ровно один общий элемент. Улучшенный метод теперь принимает замыкания, обеспечивая точную проверку того, что ровно один элемент соответствует определенным критериям:
$collection = collect([1, 2, 3]);
$collection->containsOneItem(fn($item) => $item === 2); // true
$collection->containsOneItem(fn($item) => $item > 1); // false (2 and 3 match)
Это усовершенствование оказывается особенно ценным в сценариях проверки бизнес-правил:
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;
}
}
Улучшенный метод containsOneItem() обеспечивает точную проверку коллекции, гарантируя, что ровно один элемент соответствует определенным условиям, делая применение бизнес-правил более надежным и выразительным.