# Validation
No matter how an action is run, you can define some validation logic directly within the action to ensure the provided attributes are what they are expected to be.
Note that, just like in a Laravel FormRequest, the validation logic occurs after the authorisation logic (see previous page).
TIP
The page "The lifecycle of an action" provides a handy summary of all methods that an Action will call before and after executing the handle
method.
# Defining the validation rules
Just like in a Laravel FormRequest, you can define your validation logic using the rules
and withValidator
methods.
The rules
method enables you to list validation rules for your action's attributes.
public function rules()
{
return [
'title' => ['required'],
'body' => ['required', 'min:10'],
];
}
The withValidator
method provide a convenient way to add custom validation logic.
public function withValidator($validator)
{
$validator->after(function ($validator) {
if ($this->somethingElseIsInvalid()) {
$validator->errors()->add('field', 'Something is wrong with this field!');
}
});
}
If all you want to do is add an after validation hook, you can use the afterValidator
method instead of the withValidator
method. The following example is equivalent to the one above.
public function afterValidator($validator)
{
if ($this->somethingElseIsInvalid()) {
$validator->errors()->add('field', 'Something is wrong with this field!');
};
}
TIP
It is worth noting that, just like the handle
method, the rules
, withValidator
and afterValidator
methods support dependency injections.
If you want to validate some data directly within the handle
method, you can use the validate
method.
public function handle()
{
$this->validate([
'comment' => ['required', 'min:10', 'spamfree'],
]);
}
This will validate the provided rules against the action's attributes.
# Handling failed validation
Whenever validation fails, it will throw an ValidationException
resulting in a 422 status code when used in the HTTP layer (as a controller for example).
You can change that behaviour by overriding the failedValidation
method.
protected function failedValidation()
{
throw new MyCustomExceptionForInvalidData();
}
# Accessing validated data
If you want to access all attributes that have been validated prior to reaching the handle
method, you can use $this->validated()
instead of $this->all()
.
public function rules()
{
return ['title' => 'min:3'];
}
public function handle()
{
// Will only return attributes that have been validated by the rules above.
$this->validated();
}
# Customising validation texts
You can customise the validation texts using the messages
and attributes
methods.
public function messages()
{
return [];
}
public function attributes()
{
return [];
}
TIP
It is worth noting that, just like the handle
method, the messages
, attributes
methods support dependency injections.