Laravel验证规则:二级数组字段自定义消息失效及单独配置问题
Your Current Code
$rules = [ 'name' => 'required|string|max:255', 'price' => 'required|numeric|min:0', 'unit' => 'required|in:piece,kg,m', 'price_type'=>'required|string', 'service' => [ 'string', 'required', Rule::in($services_ids->all()), ], 'facility' => [ 'string', 'required', Rule::in($facilities_ids->all()), ], 'conciergeries' => [ 'array', 'required', Rule::in($conciergeries_ids->all()), ], ]; $custom_messages = [ 'required' => 'Vous devez sélectionner un(e) :attribute.' ]; $validated = request()->validate($rules, $custom_messages);
Your Issues
- The generic
requiredmessage works for flat fields likenameorprice, but fails to apply to array-style fields (service,facility,conciergeries). - Need to create unique custom validation messages for individual fields and their specific rules.
1. Applying Custom Messages to Array-Style Fields
The problem here is that when you define validation rules as an array for a field, Laravel expects you to target the field's rule explicitly using the {field}.{rule} syntax in your custom messages array. Here's how to fix it:
Option 1: Reuse the Generic Message Structure
If you want to keep the same message format for these array fields, just add explicit keys for their required rule:
$custom_messages = [ 'required' => 'Vous devez sélectionner un(e) :attribute.', // Map required rule for each array field 'service.required' => 'Vous devez sélectionner un(e) :attribute.', 'facility.required' => 'Vous devez sélectionner un(e) :attribute.', 'conciergeries.required' => 'Vous devez sélectionner un(e) :attribute.', ];
Laravel will automatically replace :attribute with the field's name (localized if you have translations set up) just like it does for flat fields.
Option 2: Customize Messages for Each Array Field
If you want more tailored messages for each array field, you can write unique text for each:
$custom_messages = [ 'required' => 'Vous devez sélectionner un(e) :attribute.', 'service.required' => 'Vous devez choisir un service valide.', 'facility.required' => 'Veuillez sélectionner un équipement.', 'conciergeries.required' => 'Vous devez sélectionner au moins un service de conciergerie.', ];
2. Creating Field-Specific Custom Messages
To define unique messages for specific fields and their rules, use the {field}.{rule} syntax for each combination you want to override. Here are some practical examples:
Example 1: Override a Single Rule for a Field
$custom_messages = [ 'required' => 'Vous devez sélectionner un(e) :attribute.', // Unique message for name's max character limit 'name.max' => 'Le nom ne peut pas dépasser 255 caractères.', // Unique message for service's invalid selection 'service.in' => 'Le service que vous avez sélectionné n\'est pas disponible.', ];
Example 2: Override Multiple Rules for a Single Field
If you want to customize every rule for a field, just add a key for each rule:
$custom_messages = [ 'required' => 'Vous devez sélectionner un(e) :attribute.', // Full customizations for the price field 'price.numeric' => 'Le prix doit être un nombre valide.', 'price.min' => 'Le prix ne peut pas être négatif.', // Customizations for the conciergeries array field 'conciergeries.array' => 'Les services de conciergerie doivent être une liste.', 'conciergeries.in' => 'Un des services de conciergerie sélectionnés n\'est pas valide.', ];
Quick Tips
- When using rule objects like
Rule::in(), the rule name in the message key is still the lowercase version of the rule (e.g.,inforRule::in()). - You can use placeholders like
:attribute,:min, or:maxin all custom messages to keep them dynamic.
内容的提问来源于stack exchange,提问作者Tony S

