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
  • 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(),
        ],
    ]);

    // ...
}

How to enable

To enable reading request body from Laravel request validate method, make sure you have the following entries in extensions array in your configuration file (enabled by default).

    'extensions' => [
        /**
         * To enable support for `validate` method on Request class
         */
        AutoDoc\Laravel\Extensions\RequestValidate::class,

        /**
         * To enable support for `Rule::enum(..)` and `Rule::in(..)`
         */
        AutoDoc\Laravel\Extensions\ValidationRuleStaticCall::class,
    ],
Previous
Extensions