Laravel中如何绕过验证消息内的多验证属性值?
我来帮你搞定这个Laravel自定义验证消息的问题~看起来你是想在验证提示里同时展示两个属性(比如invoicedate和deadline)的关系,比如告诉用户“发票日期必须早于截止日期”对吧?下面给你两种实用的实现方式:
方式一:直接在after钩子中写自定义消息
这种方式简单直接,适合快速实现:
public static validateInfo(Request $request) { $validator = Validator::make($request->all(), [ 'referencenumber' => 'required|min:2|max:64', 'invoicedate' => 'required|date', 'deadline' => 'nullable|date' // 这里要注意,Laravel的空值规则是`nullable`不是`null`哦 ]); $validator->after(function ($validator) use ($request) { // 先判断截止日期是否填写,因为规则是nullable if (!empty($request->deadline) && strtotime($request->invoicedate) > strtotime($request->deadline)) { // 写法1:直接写死友好提示 $validator->errors()->add('invoicedate', '发票日期必须早于截止日期'); // 写法2:显示用户提交的具体日期,更直观 $validator->errors()->add('invoicedate', sprintf('你提交的发票日期 %s 必须早于截止日期 %s', $request->invoicedate, $request->deadline)); } }); // 验证失败的处理逻辑 if ($validator->fails()) { return redirect()->back()->withErrors($validator)->withInput(); } // 验证通过后的业务逻辑... }
方式二:用语言文件管理消息(推荐,便于维护和多语言)
如果你的项目需要本地化或者统一管理提示文案,这种方式更规范:
- 先在
resources/lang/zh-CN/validation.php中添加属性别名和自定义消息:
return [ // ... 保留其他默认配置 'attributes' => [ 'invoicedate' => '发票日期', 'deadline' => '截止日期', ], 'custom' => [ 'invoicedate' => [ 'before_deadline' => ':attribute 必须早于 :deadline', ], ], ];
- 然后在验证器中调用这个自定义消息:
public static validateInfo(Request $request) { $validator = Validator::make($request->all(), [ 'referencenumber' => 'required|min:2|max:64', 'invoicedate' => 'required|date', 'deadline' => 'nullable|date' ]); $validator->after(function ($validator) use ($request) { if (!empty($request->deadline) && strtotime($request->invoicedate) > strtotime($request->deadline)) { // 调用语言文件中的消息,自动替换占位符 $message = __('validation.custom.invoicedate.before_deadline', [ 'attribute' => __('validation.attributes.invoicedate'), 'deadline' => __('validation.attributes.deadline') // 如果要显示具体日期值,改成:'deadline' => $request->deadline ]); $validator->errors()->add('invoicedate', $message); } }); // 后续处理逻辑... }
额外小技巧
如果你的日期比较逻辑很简单,其实可以不用自定义after钩子,直接用Laravel自带的after规则:
'deadline' => 'nullable|date|after:invoicedate'
然后在语言文件中修改after规则的默认消息:
'after' => ':attribute 必须晚于 :date',
这样Laravel会自动生成类似“截止日期必须晚于发票日期”的提示,省掉自定义钩子的代码~
内容的提问来源于stack exchange,提问作者LowLevel
相关产品推荐
相关产品推荐

