Table Of Contents
Problem
Your API receives nested arrays (like products with variants, or users with multiple addresses) and you need to validate each element properly.
Solution
Use Laravel's dot notation and wildcard (*
) syntax in Form Requests:
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class CreateOrderRequest extends FormRequest
{
public function rules()
{
return [
'customer_email' => 'required|email',
'items' => 'required|array|min:1',
'items.*.product_id' => 'required|exists:products,id',
'items.*.quantity' => 'required|integer|min:1',
'items.*.options' => 'sometimes|array',
'items.*.options.*.name' => 'required_with:items.*.options|string',
'items.*.options.*.value' => 'required_with:items.*.options|string',
'shipping.address' => 'required|string',
'shipping.city' => 'required|string',
'shipping.postal_code' => 'required|regex:/^[0-9]{5}$/',
];
}
}
For inline validation:
$validated = $request->validate([
'users' => 'required|array',
'users.*.name' => 'required|string|max:255',
'users.*.emails' => 'required|array',
'users.*.emails.*' => 'required|email|distinct',
]);
Why It Works
Laravel's validation engine uses dot notation to traverse nested structures. The *
wildcard matches any array index, allowing validation of each array element. You can combine wildcards at multiple levels for deeply nested structures.
Custom error messages for nested fields:
public function messages()
{
return [
'items.*.quantity.min' => 'Each item must have at least 1 quantity',
'users.*.emails.*.email' => 'All user emails must be valid',
];
}
Related: Laravel Collections: Beyond Basic Array Operations | Laravel Events and Listeners: Building Decoupled Applications | Laravel API Development: Best Practices and Security | Level Up Your Laravel Validation: Advanced Tips & Tricks | Custom Laravel Validation Rules: Beyond the Basics
Add Comment
No comments yet. Be the first to comment!