Покращуйте валідацію колекцій за допомогою підтримки замикання containsOneItem

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 03 червня, 2025
Laravel суттєво вдосконалив валідацію колекцій, додавши підтримку closures до методу containsOneItem. Чи знаєте ви, як ця зміна може полегшити реалізацію бізнес-правил у вашому коді? Читайте далі, щоб дізнатися, як цей покращений метод забезпечує точну валідацію в колекціях

Laravel покращує валідацію колекцій, додаючи підтримку замикань до методу containsOneItem(). Це дозволяє розробникам перевіряти, що саме один елемент задовольняє заданим умовам, замість простого перевіряння кількості елементів у колекції

Раніше метод containsOneItem() лише з’ясовував, чи містить колекція точно один елемент. Оновлений метод тепер приймає замикання, що дозволяє точно валідувати наявність одного елемента, який відповідає конкретним критеріям:

$collection = collect([1, 2, 3]);

$collection->containsOneItem(fn($item) => $item === 2); // true
$collection->containsOneItem(fn($item) => $item > 1);   // false (2 і 3 відповідають)

Це покращення особливо корисне у сценаріях валідації бізнес-правил:

class BusinessRuleValidator
{
    public function validateTeamStructure(Collection $members)
    {
        // Перевірка наявності одного лідера команди
        if (!$members->containsOneItem(fn($member) => $member->role === 'lead')) {
            throw new ValidationException('Потрібен точно один лідер команди');
        }

        // Перевірка наявності одного уповноваженого на бюджет
        if (!$members->containsOneItem(fn($member) => $member->can_approve_budget)) {
            throw new ValidationException('Потрібен точно один уповноважений на бюджет');
        }

        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("Потрібно точно одне {$type} збори");
            }
        }

        return $items;
    }
}

Оновлений метод containsOneItem() забезпечує точну валідацію колекцій, гарантуючи, що лише один елемент відповідає визначеним умовам. Це робить дотримання бізнес-правил більш надійним і зрозумілим