Динамічна валідація форм у Laravel за допомогою правила prohibited_if

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 06 грудня, 2024
Система валідації форм у веб-застосунках потребує ретельного підходу до взаємозалежних полів. Дізнайтеся, як правило валідації `prohibited_if` у Laravel дозволяє елегантно обмежити введення полів, базуючись на значеннях інших полів, та зробіть ваші форми динамічними і інтуїтивно зрозумілими!

Валідність форм у веб-додатках вимагає дбайливого підходу до взаємозалежних полів. Правило валідації prohibited_if у Laravel пропонує елегантне рішення для умовного обмеження введення даних залежно від інших значень полів. Давайте розглянемо, як реалізувати цю потужну функцію у ваших додатках.

Що таке prohibited_if

Правило валідації prohibited_if дозволяє вам визначити, коли певні поля мають залишатися порожніми або відсутніми залежно від конкретних умов. Це особливо корисно при створенні динамічних форм з взаємозалежними полями.

use Illuminate\Support\Facades\Validator;

$validator = Validator::make($request->all(), [
    'freelance_company' => 'prohibited_if:type,individual',
    'type' => 'required|in:individual,business'
]);

Приклад використання prohibited_if у реальному житті

Розгляньмо, як реалізувати систему реєстрації членства з динамічними вимогами полів:

<?php

namespace App\Http\Controllers;

use App\Models\Membership;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;

class MembershipController extends Controller
{
    public function store(Request $request)
    {
        $request->validate([
            'membership_type' => 'required|in:personal,corporate',
            'full_name' => 'required|string|max:255',
            'organization_name' => [
                'prohibited_if:membership_type,personal',
                'required_if:membership_type,corporate',
                'string',
                'max:255',
            ],
            'organization_size' => [
                'prohibited_if:membership_type,personal',
                'required_if:membership_type,corporate',
                'integer',
                'min:1',
            ],
            'tax_id' => [
                Rule::prohibitedIf(fn() =>
                    $request->membership_type === 'personal' ||
                    $request->country !== 'US'
                ),
                'string',
                'size:9',
            ],
        ], [
            'organization_name.prohibited_if' => 'Дані про організацію не повинні надаватися для особистого членства.',
            'tax_id.prohibited_if' => 'Номер податкового ідентифікаційного коду потрібен лише для корпоративного членства з США.',
        ]);
        Membership::create($request->validated());
        return response()->json([
            'message' => 'Членство успішно створено'
        ]);
    }
}

Ця реалізація демонструє:

Ви можете розширити цю можливість, врахувавши кілька умов:

'business_license' => [
    Rule::prohibitedIf(fn() =>
        $request->membership_type === 'personal' ||
        !in_array($request->business_type, ['retail', 'franchise'])
    ),
    'required_if:business_type,retail,franchise',
    'string',
]

Правило prohibited_if дозволяє створювати складну логіку валідації форм, зберігаючи при цьому чистий і зрозумілий код. Цей підхід забезпечує коректну обробку введених даних користувачами з урахуванням контексту