Laravel表单SELECT下拉字段设置required验证后不触发报错问题
问题原因
- 核心原因是下拉框默认选项的值非空:你代码中默认的提示选项
<option value="177">Select a category</option>的value属性值为177,用户未主动选择其他选项提交表单时,category_id字段会提交177这个有效值,满足required规则的非空要求,所以不会触发验证错误,自然没有反馈。 - 次要潜在问题:错误样式的判断逻辑不规范:你给select元素添加
is-invalid错误类时使用$errors->get('category_id')做判断,虽然无错误时返回的空数组会被判定为false,但更严谨的写法是使用$errors->has('category_id')直接判断该字段是否存在验证错误,避免特殊场景下判断异常。
解决方法
按以下步骤修改即可:
- 修改下拉框默认选项的value值为空,让未选择时提交空值触发required验证:
将默认option改为:<option value="">Select a category</option> - 优化错误类的判断逻辑,保证验证失败时能正确加载高亮样式:
将select标签的class属性修改为:class="form-control {{ $errors->has('category_id') ? 'is-invalid' : '' }}"
如果你确实需要保留默认选项的value为177,可以将验证规则调整为如下配置,也能实现必填校验:
'category_id' => 'required|not_in:177',
完整修改后的代码示例
<div class="form-group"> <label for="category-id">Category</label> <select id="category-id" class="form-control {{$errors->has('category_id') ? 'is-invalid' : ''}}" name="category_id"> <option value="">Select a category</option> @foreach ($categories as $category) <option value="{{$category['id']}}">{{$category['title']}}</option> @endforeach </select> @if ($errors->has('category_id')) <div class="invalid-feedback"><strong>{{$errors->first('category_id')}}</strong></div> @endif </div>
内容的提问来源于stack exchange,提问作者Md Nurul Afsar Pervez
相关产品推荐
相关产品推荐

