Laravel如何根据单选按钮选中状态校验对应表单字段
单选切换对应表单字段的校验实现方案
一、前端代码优化
现有前端代码存在两个问题:单选按钮未向后台传递选中值、隐藏字段提交时会携带无效值,修正后的代码如下:
<div class="sm:col-span-2"> <div class="mt-4"> <nav class="" aria-label="Tabs"> <div class="border-gray-300 border-2 rounded-lg pl-3 py-2 w-40" :class="tab == 'tab1' ? ' bg-green-200 border-green-500 ' : ''"> <!-- 新增value属性、用:checked绑定选中状态、用x-model绑定变量更稳妥 --> <input type="radio" x-model="tab" value="person" :checked="tab == 'tab1'" name="person_company"> <span class="text-gray-600 font-medium text-sm pl-2">个人</span> </div> <br> <div class="border-gray-300 border-2 rounded-lg pl-3 py-2 w-40" :class="tab == 'tab2' ? ' bg-green-200 border-green-500 ' : ''"> <input type="radio" x-model="tab" value="company" :checked="tab == 'tab2'" name="person_company"> <span class="text-gray-600 font-medium text-sm pl-2">企业</span> </div> </nav> </div> </div> <!-- 切换tab时清空隐藏字段的值,避免提交无效参数 --> <div class="sm:col-span-2 " x-show="tab == 'tab1'" x-transition @click="document.getElementById('company').value = ''"> <label for="identity_no" class="block text-sm font-medium text-gray-700">身份证号</label> <div class="mt-1"> <input type="text" name="identity_no" id="identity_no" class="block w-full py-4 border-gray-300 rounded-md shadow-sm focus:ring-green-500 focus:border-green-500 sm:text-sm"> </div> </div> <div class="sm:col-span-2" x-show="tab == 'tab2'" x-transition @click="document.getElementById('identity_no').value = ''"> <label for="company" class="block text-sm font-medium text-gray-700">企业名称</label> <div class="mt-1"> <input type="text" name="company" id="company" class="block w-full py-4 border-gray-300 rounded-md shadow-sm focus:ring-green-500 focus:border-green-500 sm:text-sm"> </div> </div>
也可以补充前端实时校验逻辑,切换tab或者输入时先校验当前展示字段的格式合法性,减少不必要的后端请求。
二、后端校验逻辑调整
直接使用Laravel自带的required_if条件校验规则即可实现按单选值校验对应字段,规则说明:required_if:关联字段名,匹配值 代表当关联字段等于指定匹配值时,当前字段必填。
修正后的校验代码如下:
$this->validate($request,[ // 先校验单选字段合法性,避免传入非法值绕过校验 'person_company' => 'required|in:person,company', // 选中个人时身份证号必填 'identity_no' => 'required_if:person_company,person', // 选中企业时企业名称必填 'company' => 'required_if:person_company,company', ]);
如果需要附加其他校验规则(比如身份证号格式校验、企业名称长度限制),直接在对应字段的规则后追加即可。
内容的提问来源于stack exchange,提问作者wertyu
相关产品推荐
相关产品推荐

