0

Validation error messages — custom messages, translation files

Beginner5 min read·lv-11-009

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:

php
$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
<?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.',
//         ],
//     ],
// ];