Laravel中readonly只读计算字段的验证规则失效如何解决?
问题根因
- 浏览器原生表单验证会默认跳过带有
readonly属性的输入框,即便你设置了min、required等校验规则也不会触发前端校验。 - 你当前
driving_time的min属性直接写了JS表达式,HTML不会解析执行这段代码,所以驾驶时长的最小值限制根本没有生效。 - 后端校验规则写的是
min:0,允许值为0,不符合要求字段始终为正数的规则,拦截不到负数和0的情况。
修复方案
前端部分
- 完善计算逻辑的校验,在两个输入字段值变化时就提前判断计算结果是否合法,同时动态设置驾驶时长的最小值,从源头避免出现负数结果:
function myChangeFunction() { const workTime = parseInt(document.getElementById('work_time').value) || 0; const drivingTime = parseInt(document.getElementById('driving_time').value) || 0; // 按规则计算admin_time const adminTime = 480 - workTime + drivingTime; const adminTimeInput = document.getElementById('admin_time'); adminTimeInput.value = adminTime; // 校验计算结果合法性 if (adminTime < 1) { adminTimeInput.setCustomValidity('Admin time必须为正数,请调整工作时长或驾驶时长'); } else { adminTimeInput.setCustomValidity(''); } // 动态设置驾驶时长最小值,保证计算结果≥1 document.getElementById('driving_time').min = workTime - 479; } // 表单提交前再做一次兜底校验 document.querySelector('form').addEventListener('submit', function(e) { const adminTime = parseInt(document.getElementById('admin_time').value) || 0; if (adminTime < 1) { e.preventDefault(); alert('Admin time计算结果为负数,请调整工作时长或驾驶时长后再提交'); } })
- 调整
admin_time输入框的min属性为1,匹配正数要求:
<input type="number" style="width: 7em" name="admin_time" class="form-control" id="admin_time" min="1" step="1" readonly required>
后端部分
修改校验规则,把min:0改成min:1,同时加上整数校验,就算前端校验被绕过,后端也会拦截非法值:
$request->validate([ 'admin_time'=>'required|integer|min:1|max:480', ]);
内容的提问来源于stack exchange,提问作者voxire
相关产品推荐
相关产品推荐

