Validation error messages — custom messages, translation files
Concept
Laravel's validation system lets you customize error messages at multiple levels: inline in the rules call, in a Form Request class, and via language files for application-wide translations.
Default messages: Laravel provides default messages for all built-in rules: "The :attribute field is required.", "The :attribute must be at least :min characters.". The :attribute placeholder is replaced with the field name (or a custom attribute label).
Custom messages per validation call:
$request->validate($rules, [
'email.required' => 'Please enter your email address.',
'email.email' => 'The email address format is invalid.',
'password.min' => 'Your password must be at least :min characters.',
]);Message key format: field_name.rule_name.
Custom messages in Form Requests: Override messages() method.
Custom attribute names: By default, the field name (with underscores as spaces) appears in messages. Override with attributes(): ['first_name' => 'first name', 'dob' => 'date of birth'].
Language files: lang/en/validation.php contains all default validation messages. Override specific messages here for application-wide customization. For multi-language: lang/fr/validation.php, etc.
:attribute, :input, :min, :max, :value — placeholder tokens that Laravel replaces in message templates.
Code Example
<?php
// Inline custom messages
$request->validate([
'email' => 'required|email|unique:users',
'password' => 'required|min:8|confirmed',
'age' => 'required|integer|min:18|max:120',
], [
'email.required' => 'An email address is required.',
'email.email' => 'Please provide a valid email address.',
'email.unique' => 'This email is already registered. Did you forget your password?',
'password.min' => 'Your password must be at least :min characters long.',
'password.confirmed'=> 'The password confirmation does not match.',
'age.min' => 'You must be at least :min years old to register.',
], [
'email' => 'email address', // custom attribute label
'password' => 'password',
'age' => 'age',
]);
// Form Request — messages() and attributes()
class RegisterRequest extends \Illuminate\Foundation\Http\FormRequest
{
public function rules(): array
{
return [
'username' => 'required|alpha_dash|min:3|max:20|unique:users',
'email' => 'required|email|unique:users',
'password' => 'required|min:8|confirmed',
'birthdate' => 'required|date|before:-18 years',
];
}
public function messages(): array
{
return [
'username.alpha_dash' => 'Username may only contain letters, numbers, dashes, and underscores.',
'username.unique' => 'This username is taken. Please choose another.',
'birthdate.before' => 'You must be at least 18 years old to register.',
];
}
public function attributes(): array
{
return [
'username' => 'username',
'birthdate' => 'date of birth',
];
}
}
// lang/en/validation.php — application-wide message overrides
// return [
// 'required' => 'The :attribute field cannot be empty.',
// 'unique' => 'This :attribute is already in use.',
// 'custom' => [
// 'email' => [
// 'required' => 'An email address is required to register.',
// ],
// ],
// ];