Laravel

Request validation

PHP autodoc-laravel automatically determines request body type by analyzing your request validation rules. It supports the following Laravel validation rules:

  • array
  • boolean
  • confirmed
  • current_password
  • date
  • email
  • in
  • integer
  • ipv4
  • ipv6
  • nullable
  • numeric
  • min
  • max
  • object
  • present
  • required
  • required_array_keys
  • required_if*
  • required_if_accepted*
  • required_if_declined*
  • required_unless*
  • required_with*
  • required_with_all*
  • required_without*
  • required_without_all*
  • string
  • uuid
  • url
  • Illuminate\Validation\Rules\ArrayRule
  • Illuminate\Validation\Rules\Enum
  • Illuminate\Validation\Rules\Email
  • Illuminate\Validation\Rules\In
  • Illuminate\Validation\Rules\Password

* - Not supported by OpenApi 3.1. For this rule a description will be generated for the associated parameter. You can enable/disable this behavior with laravel.generate_descriptions_from_validation_rules configuration option.

Example 1

This example demonstrates the support for PHPDoc annotations, PHPStan type aliases and some validation rules.

/**
 * @phpstan-type Symbol 'a'|'b'|'c'
 */
class ExampleController extends Controller
{
    public function create(Request $request)
    {
        $request->validate([
            'records' => 'required|array',

            /**
             * This parameter reads type from `@var` tag.
             * 
             * @var Symbol
             */
            'records.*.symbol' => 'sometimes',

            'records.*.count' => 'integer|nullable|min:0',

            /**
             * @example 2024-10-20
             */
            'records.*.created_at' => 'date',

            /**
             * @var array<string, array{
             *     count: int,
             *     symbol: Symbol,
             * }>
             */
            'key\.with_dot' => 'required',
        ]);

        // ...
    }
}

Example 2

This example demonstrates more advanced expressions that affect both request and response body.

use Illuminate\Validation\Rules\Enum;
// ...

public function addIp(): JsonResponse
{
    $validationRules = [
        'ip_address_v4' => ['nullable', 'ipv4'],
        'ip_address_v6' => [
            'nullable',
            'ipv6',
            'required_without:ip_address_v4',
        ],
        'type' => ['required', new In(['static', 'dynamic'])],
    ];

    $validationRules['status'][] = new Enum(IpStatusEnum::class);
    $validationRules['status'][] = 'required';

    $validated = request()->validate($validationRules);
    $isPending = $validated['status'] === IpStatusEnum::Pending;

    return response()->json([
        'success' => true,
        'type_added' => $isPending
            ? $validated['type']
            : null,
    ]);
}

Example 3

use Illuminate\Http\Request;
use Illuminate\Validation\Rules\Enum;
// ...

public function sendFeedback(Request $request)
{
    $request->validate([
        'message' => ['required', 'string', 'min:1', 'max:1000'],
        'category' => [
            'required',
            new Enum(FeedbackCategory::class),
        ],
        'priority' => 'in:low,high',
        'explanation' => 'required_if:priority,high',
    ]);
}

Example 4

This example is based on default /reset-password route provided by Laravel 12.

use Illuminate\Http\Request;
use Illuminate\Validation\Rules\Password;
// ...

/**
 * Handle an incoming new password request.
 */
public function store(Request $request): RedirectResponse
{
    $request->validate([
        'token' => 'required',
        'email' => 'required|email',
        'password' => [
            'required',
            'confirmed',
            Password::defaults(),
        ],
    ]);

    // ...
}
Previous
Routing