Dynamic Form Validation in Laravel with prohibited_if

Dynamic Form Validation in Laravel with prohibited_if

Dynamic Form Validation in Laravel with prohibited_if

Form validation in web applications requires careful handling of interdependent fields.

Laravel's prohibited_if validation rule provides an elegant solution for conditionally restricting field inputs based on other field values. 

Let's explore how to implement this powerful feature in your applications.

1 - Understanding prohibited_if

The prohibited_if validation rule enables you to specify when certain fields must remain empty or absent based on specific conditions. This proves invaluable when building dynamic forms with interdependent fields.

Example:

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

2 - Real-World example of prohibited_if

– Let's implement a professional membership registration system with dynamic field requirements:

<?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' => 'Organization details should not be provided for personal memberships.',
            'tax_id.prohibited_if' => 'Tax ID is only required for US-based corporate memberships.',
        ]);
        Membership::create($request->validated());
        return response()->json([
            'message' => 'Membership created successfully'
        ]);
    }
}

This implementation demonstrates:

  • Dynamic field requirements based on membership type
  • Conditional tax ID validation for US corporate members
  • Custom error messages for clarity
  • Combined usage with other validation rules

– You can extend this further with multiple conditions:

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

The prohibited_if rule enables the creation of sophisticated form validation logic while maintaining clean, readable code. This approach ensures your forms handle user input appropriately based on context.

All Comments