You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中readonly只读计算字段的验证规则失效如何解决?

问题根因

  1. 浏览器原生表单验证会默认跳过带有readonly属性的输入框,即便你设置了min、required等校验规则也不会触发前端校验。
  2. 你当前driving_time的min属性直接写了JS表达式,HTML不会解析执行这段代码,所以驾驶时长的最小值限制根本没有生效。
  3. 后端校验规则写的是min:0,允许值为0,不符合要求字段始终为正数的规则,拦截不到负数和0的情况。

修复方案

前端部分

  1. 完善计算逻辑的校验,在两个输入字段值变化时就提前判断计算结果是否合法,同时动态设置驾驶时长的最小值,从源头避免出现负数结果:
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计算结果为负数,请调整工作时长或驾驶时长后再提交');
  }
})
  1. 调整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 04:06:07