Laravel 8如何实现年龄小于18时对应文本框设为必填校验
Laravel 8 实现未成年人相关字段条件必填校验方案
方案1:使用表单请求类(官方推荐)
这种方式将校验逻辑和业务逻辑分离,可维护性更高,适合复杂表单场景。
- 第一步:生成表单请求类
执行Artisan命令:php artisan make:request UserStoreRequest - 第二步:编写校验规则
打开app/Http/Requests/UserStoreRequest.php文件,编写如下代码:<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; use Carbon\Carbon; class UserStoreRequest extends FormRequest { public function authorize() { // 不需要校验权限直接返回true,有权限判断逻辑可自行调整 return true; } public function rules() { // 提前判断提交的用户是否为未成年人 $isMinor = Carbon::parse($this->input('birth_date'))->age < 18; return [ 'birth_date' => 'required|date', // 未成年人时家长相关字段必填,成年后可空 'parent_name' => $isMinor ? 'required|string|max:255' : 'nullable|string|max:255', 'parent_phone' => $isMinor ? 'required|numeric' : 'nullable|numeric', 'parent_id_card' => $isMinor ? 'required|string|size:18' : 'nullable|string|size:18', // 其他字段的校验规则继续补充即可 ]; } // 自定义错误提示(可选) public function messages() { return [ 'parent_name.required' => '未满18周岁的用户必须填写家长姓名', 'parent_phone.required' => '未满18周岁的用户必须填写家长联系电话', 'parent_id_card.required' => '未满18周岁的用户必须填写家长身份证号', ]; } } - 第三步:控制器中调用
在对应的控制器方法中直接注入该请求类即可自动完成校验:public function store(UserStoreRequest $request) { // 校验通过后拿到合法数据 $validated = $request->validated(); // 后续业务逻辑 }
方案2:控制器内直接校验
如果表单逻辑比较简单,也可以直接在控制器中编写校验规则:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Carbon\Carbon; class UserController extends Controller { public function store(Request $request) { $isMinor = Carbon::parse($request->input('birth_date'))->age < 18; $validated = $request->validate([ 'birth_date' => 'required|date', 'parent_name' => $isMinor ? 'required|string|max:255' : 'nullable|string|max:255', 'parent_phone' => $isMinor ? 'required|numeric' : 'nullable|numeric', // 其他字段规则继续补充 ], [ 'parent_name.required' => '未满18周岁的用户必须填写家长姓名', // 其他自定义提示继续补充 ]); // 后续业务逻辑 } }
注意事项
- 必须给
birth_date字段加上date校验规则,确保提交的是合法日期格式,避免Carbon解析出错。 - 如果需要兼容特定出生日期格式,可以在
date规则后加date_format:Y-m-d等自定义格式规则。
内容的提问来源于stack exchange,提问作者Ankur Kathuria
相关产品推荐
相关产品推荐

