Skip to main content
Laravel Data provides validation attributes that correspond to Laravel’s validation rules. Use these attributes on data properties to automatically generate validation rules.

String Validation

Docs
#[Alpha]
public string $name;
Docs
#[AlphaDash]
public string $username;
Docs
#[AlphaNumeric]
public string $code;
Docs
#[StringType]
public string $text;
Docs
#[Lowercase]
public string $email;
Docs
#[Uppercase]
public string $countryCode;

Numeric Validation

Docs
#[IntegerType]
public int $count;
Docs
#[Numeric]
public string|int|float $amount;
Docs
#[Min(20)]
public int $age;
Docs
#[Max(100)]
public int $percentage;
Docs
#[Between(3.14, 42)]
public float $value;
Docs
#[Digits(10)]
public int $phoneNumber;
Docs
#[DigitsBetween(2, 10)]
public int $code;
Docs
#[MinDigits(2)]
public int $value;
Docs
#[MaxDigits(10)]
public int $value;
Docs
#[MultipleOf(3)]
public int $quantity;

Date Validation

Docs
#[Date]
public Carbon $date;
Docs
#[DateFormat('d-m-Y')]
public Carbon $date;

#[DateFormat(['Y-m-d', 'Y-m-d H:i:s'])]
public Carbon $date;
Docs
#[DateEquals('tomorrow')]
public Carbon $date;

#[DateEquals(Carbon::yesterday())]
public Carbon $date;
Docs
#[After('tomorrow')]
public Carbon $date;

#[After(Carbon::yesterday())]
public Carbon $date;

#[After(new FieldReference('start_date'))]
public Carbon $endDate;
Docs
#[AfterOrEqual('tomorrow')]
public Carbon $date;

#[AfterOrEqual(new FieldReference('start_date'))]
public Carbon $endDate;
Docs
#[Before('tomorrow')]
public Carbon $date;

#[Before(new FieldReference('end_date'))]
public Carbon $startDate;
Docs
#[BeforeOrEqual('tomorrow')]
public Carbon $date;

#[BeforeOrEqual(new FieldReference('end_date'))]
public Carbon $startDate;

Boolean & Acceptance

Docs
#[BooleanType]
public bool $active;
Docs
#[Accepted]
public bool $termsAccepted;
Docs
#[AcceptedIf('other_field', 'equals_this')]
public bool $confirmation;
Docs
#[Declined]
public bool $optOut;
Docs
#[DeclinedIf('other_field', 'equals_this')]
public bool $optOut;

Array Validation

Docs
#[ArrayType]
public array $items;

#[ArrayType(['valid_key', 'other_valid_key'])]
public array $items;

#[ArrayType('valid_key', 'other_valid_key')]
public array $items;
Docs
#[ListType]
public array $items;
Docs
#[RequiredArrayKeys('a')]
public array $items;

#[RequiredArrayKeys(['a', 'b'])]
public array $items;

#[RequiredArrayKeys('a', 'b')]
public array $items;
Docs
#[Distinct]
public string $value;

#[Distinct(Distinct::Strict)]
public string $value;

#[Distinct(Distinct::IgnoreCase)]
public string $value;

String Patterns

Docs
#[StartsWith('a')]
public string $value;

#[StartsWith(['a', 'b'])]
public string $value;

#[StartsWith('a', 'b')]
public string $value;
Docs
#[EndsWith('a')]
public string $value;

#[EndsWith(['a', 'b'])]
public string $value;
Docs
#[DoesntStartWith('a')]
public string $value;

#[DoesntStartWith(['a', 'b'])]
public string $value;
Docs
#[DoesntEndWith('a')]
public string $value;
Docs
#[Regex('/^.+$/i')]
public string $value;
Docs
#[NotRegex('/^.+$/i')]
public string $value;

Email & URL

Docs
#[Email]
public string $email;

#[Email(Email::RfcValidation)]
public string $email;

#[Email([Email::RfcValidation, Email::DnsCheckValidation])]
public string $email;
Docs
#[Url]
public string $website;

#[Url(['http', 'https'])]
public string $website;
Docs
#[ActiveUrl]
public string $website;

IP & Network

Docs
#[IP]
public string $ipAddress;
Docs
#[IPv4]
public string $ipAddress;
Docs
#[IPv6]
public string $ipAddress;
Docs
#[MacAddress]
public string $macAddress;

Database

Docs
#[Exists('users')]
public string $userId;

#[Exists(User::class)]
public string $userId;

#[Exists('users', 'email')]
public string $email;

#[Exists('users', 'email', connection: 'tenant')]
public string $email;

#[Exists('users', 'email', withoutTrashed: true)]
public string $email;
Docs
#[Unique('users')]
public string $email;

#[Unique(User::class)]
public string $email;

#[Unique('users', 'email')]
public string $email;

#[Unique('users', connection: 'tenant')]
public string $email;

#[Unique('users', withoutTrashed: true)]
public string $email;

#[Unique('users', ignore: 5)]
public string $email;

#[Unique('users', ignore: new AuthenticatedUserReference())]
public string $email;

#[Unique('posts', ignore: new RouteParameterReference('post'))]
public string $slug;

File Validation

Docs
#[File]
public UploadedFile $document;
Docs
#[Image]
public UploadedFile $photo;
Docs
#[Mimes('jpg')]
public UploadedFile $image;

#[Mimes(['jpg', 'png'])]
public UploadedFile $image;

#[Mimes('jpg', 'png')]
public UploadedFile $image;
Docs
#[MimeTypes('video/quicktime')]
public UploadedFile $video;

#[MimeTypes(['video/quicktime', 'video/avi'])]
public UploadedFile $video;
Docs
#[Dimensions(ratio: 1.5)]
public UploadedFile $image;

#[Dimensions(maxWidth: 100, maxHeight: 100)]
public UploadedFile $image;

Field Relationships

Docs
#[Required]
public string $name;
Docs
#[RequiredIf('other_field', 'value')]
public ?string $conditional;

#[RequiredIf('other_field', ['value', 'another_value'])]
public ?string $conditional;
Docs
#[RequiredUnless('other_field', 'value')]
public ?string $conditional;
Docs
#[RequiredWith('other_field')]
public ?string $conditional;

#[RequiredWith(['other_field', 'another_field'])]
public ?string $conditional;
Docs
#[RequiredWithAll(['other_field', 'another_field'])]
public ?string $conditional;
Docs
#[RequiredWithout('other_field')]
public ?string $conditional;
Docs
#[RequiredWithoutAll(['other_field', 'another_field'])]
public ?string $conditional;
Docs
#[Same('other_field')]
public string $confirmation;
Docs
#[Different('other_field')]
public string $value;
Docs
#[Confirmed]
public string $password;

Advanced

Docs
#[Enum(ChannelType::class)]
public string $channel;

#[Enum(ChannelType::class, only: [ChannelType::Email])]
public string $channel;

#[Enum(ChannelType::class, except: [ChannelType::Email])]
public string $channel;
Docs
#[Uuid]
public string $id;
Docs
#[Ulid]
public string $id;
Docs
#[Json]
public string $metadata;
Docs
#[TimeZone]
public string $timezone;
Docs
#[Password(min: 12, letters: true, mixedCase: true, numbers: false, symbols: false, uncompromised: true, uncompromisedThreshold: 0)]
public string $password;
Docs
#[CurrentPassword]
public string $currentPassword;

#[CurrentPassword('api')]
public string $currentPassword;

Special Rules

Define custom validation rules:
#[Rule('string|uuid')]
public string $id;

#[Rule(['string','uuid'])]
public string $id;
Docs
#[Nullable]
public ?string $optionalField;
Docs
#[Sometimes]
public string $value;
Docs
#[Bail]
public string $value;
Docs
#[Filled]
public string $value;
Docs
#[Present]
public string $value;

Comparison

Docs
#[GreaterThan('other_field')]
public int $value;
Docs
#[GreaterThanOrEqualTo('other_field')]
public int $value;
Docs
#[LessThan('other_field')]
public int $value;
Docs
#[LessThanOrEqualTo('other_field')]
public int $value;
Docs
#[Size(10)]
public string $value;

Lists & Values

Docs
#[In([1, 2, 3, 'a', 'b'])]
public mixed $value;

#[In(1, 2, 3, 'a', 'b')]
public mixed $value;
Docs
#[NotIn([1, 2, 3, 'a', 'b'])]
public mixed $value;
Docs
#[InArray('other_field')]
public string $value;

Prohibition

Docs
#[Prohibited]
public ?string $value;
Docs
#[ProhibitedIf('other_field', 'has_value')]
public ?string $value;

#[ProhibitedIf('other_field', ['has_value', 'or_this_value'])]
public ?string $value;
Docs
#[ProhibitedUnless('other_field', 'has_value')]
public ?string $value;
Docs
#[Prohibits('other_field')]
public ?string $value;

#[Prohibits(['other_field', 'another_field'])]
public ?string $value;

Exclusion

At the moment the data is not yet excluded due to technical reasons. Version 4 should fix this.
Docs
#[ExcludeIf('other_field', 'has_value')]
public string $value;
Docs
#[ExcludeUnless('other_field', 'has_value')]
public string $value;
Docs
#[ExcludeWith('other_field')]
public string $value;
Docs
#[ExcludeWithout('other_field')]
public string $value;