How to Validate Arrays with Specific Values in Laravel

How to Validate Arrays with Specific Values in Laravel
Photo by Walls.io / Unsplash

Laravel makes input validation straightforward, but when dealing with arrays containing specific allowed values, a more precise approach is needed. This article will guide you through crafting robust validation rules, along with key considerations to handle edge cases effectively.

Understanding the Challenge

Suppose you’re designing an API where a tags field is optional but, when provided, must:

  • Be an array of strings.
  • Only contain specific allowed values, such as active, inactive, archived, and featured.

For such cases, Laravel provides tools like in rules and array validation, enabling precise control over input data.

Validation Rules Example

Here’s how you can define validation rules for such a scenario:

$rules = [
    'user_id' => 'required|integer', // Ensures the user identifier is required and valid
    'item_id' => 'nullable|integer', // Optional field for a specific item
    'tags' => 'nullable|array', // Ensures tags is an optional array
    'tags.*' => 'nullable|string|in:active,inactive,archived,featured', // Validates each tag value
];

Rule Breakdown:

  1. user_id: A required field that must be an integer.
  2. item_id: Optional but must be an integer when provided.
  3. tags: Optional but must be an array if supplied.
  4. tags.*: Each element in the tags array must be a string and one of the allowed values: active, inactive, archived, or featured.

Advanced Considerations

1. Dynamic Allowed Values

If the allowed values are dynamic (e.g., fetched from a database), you can use Laravel's Rule class:

use Illuminate\Validation\Rule;

$rules = [
    'tags.*' => ['nullable', 'string', Rule::in(['active', 'inactive', 'archived', 'featured'])],
];

This makes it easier to update the valid options programmatically.

2. Handling Empty Arrays

Ensure that the tags array can be empty when provided. To achieve this, include the nullable|array rule:

'tags' => 'nullable|array',

This ensures that an empty array like [] passes validation while still validating non-empty arrays.

3. Custom Validation Messages

Laravel automatically generates error messages, but you can customize them to improve clarity:

$messages = [
    'tags.*.in' => 'Each tag must be one of the following: active, inactive, archived, or featured.',
];

4. Non-Array Input Handling

If a non-array value (e.g., a string or integer) is provided for tags, the array rule ensures it fails validation:

'tags' => 'nullable|array',

This is useful for ensuring the input format is always consistent.

Example Input Scenarios

Valid Input:

{
    "user_id": 1,
    "tags": ["active", "featured"]
}

Invalid Input:

  1. Invalid Tag Value:
{
    "user_id": 1,
    "tags": ["invalid"]
}

Error: Each tag must be one of the following: active, inactive, archived, or featured.

  1. Non-Array Tags:
{
    "user_id": 1,
    "tags": "active"
}

Error: The tags field must be an array.

Testing Validation

You should test your validation rules to ensure they cover all edge cases. For example:

public function testTagsValidation()
{
    $response = $this->postJson('/api/example', [
        'user_id' => 1,
        'tags' => ['active', 'invalid'],
    ]);

    $response->assertStatus(422)
             ->assertJsonValidationErrors(['tags.1']);
}

This ensures your API behaves predictably under various conditions.


Finally

Laravel’s validation tools are powerful, but achieving clean and reliable input requires careful consideration of edge cases. By leveraging array rules, in constraints, and dynamic validation options, you can ensure consistent data integrity.

Key takeaways from this guide include:

  • Use nullable|array for optional array fields.
  • Validate each array element with in or Rule::in.
  • Customize error messages for better API usability.

With these practices, you can build APIs that are both robust and user-friendly.

Support Us