jegramos's avatar

Laravel 9 Enum Validation Custom Message

I have this rule in my FormRequest:

'role' => ['required', new Enum(Role::class)]

The thing is, I want to display a custom message but can't find the right message key for it. For example, in my message() method I have something like this:

'role.enum' => 'Valid role values are regular, admin, super-admin.

enum doesn't work. I've also tried enumeration, enum_value, etc. I can't find it anywhere in Laravel's docs as well

0 likes
7 replies
Sergiu17's avatar

Go to lang/en/validation.php and add a new key

'enum' => 'Valid role values are regular, admin, super-admin.'
jegramos's avatar

@Sergiu17 Do you mean modifying this message directly in lang/en/validation.php?

  'enum' => 'The selected :attribute is invalid.',

Since I use enum rules in multiple fields (not just role), I don't think that would be a good idea

Sinnbeck's avatar

Can you show the complete form request (with the custom message)?

I notice you write

For example, in my message() method I have something like this:

The method is named messages() not message()

jegramos's avatar

@Sinnbeck My bad :) It's messages()

public function rules(): array
    {
        $routeName = $this->route()->getName();
        $todayDate = date('Y-m-d');

        return match ($routeName) {
            'users.store' => $this->getStoreUserRules($todayDate),
            'users.update' => $this->getUpdateUserRules($todayDate),
            default => []
        };
    }
private function getStoreUserRules($todayDate): array
    {
        return [
            'email' => ['required', 'email', 'unique:users,email', 'max:255'],
            'password' => ['string', 'required', 'confirmed', Password::min(8)->mixedCase()->numbers()],
            'first_name' => ['string', 'required', 'max:255'],
            'last_name' => ['string', 'required', 'max:255'],
            'middle_name' => ['nullable', 'max:255'],
            'mobile_number' => ['nullable', 'regex:/^(\+63)\d{10}$/'],
            'sex' => ['nullable', new Enum(Sex::class)],
            'profile_picture_url' => ['nullable', 'active_url', 'max:255'],
            'meta' => ['nullable', new IsJson()],
            'roles' => ['required', 'array'],
            'roles.*' => ['required', new Enum(Role::class)],
        ];
    }
public function messages()
    {
        return [
            'mobile_number.regex' => 'The mobile_number field should follow this format: +63XXXXXXXXXX.',

            /** These are not working. Can't find it anywhere in Laravel 9 docs
             * @see https://laracasts.com/discuss/channels/laravel/laravel-9-enum-validation-custom-message
             */
            'sex.enum' => 'Valid values are `male` and `female`.',
            'roles.*.enum' => 'Valid role values are `regular`, `security`, `medical`, and `health-officer`.',
        ];
    }

Other rule messages overwrite work just fine, such as required, regex, etc. I've satisfied all requirements as well (Enums requires PHP 8.1)

Somehow sex.enum and roles.*.enum don't work -- which is kinda odd

Sergiu17's avatar
Sergiu17
Best Answer
Level 60

@jegramos

'rules.Illuminate\Validation\Rules\Enum' => 'Valid role values are regular, admin, super-admin.'
7 likes

Please or to participate in this conversation.