php - Laravel 5.7 验证带星号的字段,required_if
问题描述
我有一个 Vue 表单,可以让用户为那里的个人资料添加工作经验。用户可以通过单击按钮添加额外的体验。单击该按钮将添加一个带有新输入字段的新项目。我无法添加整个脚本,因为它已经很大了。但这里有一个例子给你一个想法:
<div class="item">
<div class="row">
<div class="form-group col-md-6">
<label class="form-label">Title</label>
<input type="text" name="experiences[0][title]" class="form-control">
</div>
<div class="form-group col-md-6">
<label class="form-label">Institution</label>
<input type="text" name="experiences[0][institution]" class="form-control">
</div>
</div>
<div class="row">
<div class="col-md-12">
<textarea name="experiences[0][comments]" class="form-control"></textarea>
</div>
</div>
</div>
<div class="item">
<div class="row">
<div class="form-group col-md-6">
<label class="form-label">Title </label>
<input type="text" name="experiences[1][title]" class="form-control">
</div>
<div class="form-group col-md-6">
<label class="form-label">institution </label>
<input type="text" name="experiences[1][institution]" class="form-control">
</div>
</div>
<div class="row">
<div class="col-md-12">
<textarea name="experiences[1][comments]" class="form-control"></textarea>
</div>
</div>
</div>
每个元素后都有一个按钮来添加新行。这工作正常,但我有一些验证问题。如果其中一个字段有值,我只想验证这些字段。例如:如果experiences[0][institution]
有一个值,experiences[0][title]
并且experiences[0][comments]
是必需的。这必须在每个订单中都有效。如果title
有值,则需要其他字段。我真的无法找到一种方法来验证这一点。这是我的验证规则:
$this->validate(request(), [
'experiences.*.title' => 'required_if:experiences.*.institution,null',
'experiences.*.institution' => 'required_if:experiences.*.title,null',
]);
这里的问题是它根本无法验证。我不知道如何制定一条规则,如果字段 X 有值,则需要 Y 和 Z。
希望这里的任何人都可以帮助我找到解决方案!:)
解决方案
就像 Azeame 所说,制定一个自定义验证规则并检查所有值是否已填充或全部为空。在德行的东西:
public function passes($attribute, $value)
{
$required = ['title','institution','comments'];
$experience = collect($value)->reject(function ($item, $key) {
return empty($item);
});
if (count($experience) == 0) {
return true;
}
foreach ($required as $field) {
if ( !$experience->has($field)) {
return false;
}
}
return true;
}
也许有更好的方法,但这应该可行。
推荐阅读
- javascript - Cypress: same tests that pass in browser fail in headless mode due to timeout
- java - 来自远程调用的数据验证 - 微服务
- sql - 错误 ORA-01841:(完整)年份必须在 -4713 和 +9999 之间,并且在使用 yyyymmdd 格式加载数据时不能为 0
- javascript - v-on:change (VueJS) 不适用于范围滑块(隐藏输入)
- c# - 将 Microsoft Graph 与 ASP .NET Identity 外部身份验证结合使用
- rest - 如何列出对服务器进行的 REST API 调用
- ios - iOS | 点击标记缩小 Google Map SDK
- javascript - Javascript 解析 JSON 相似
- kubernetes - preStop 钩子没有被执行
- python - 尝试在 Django 服务器上渲染 Folium 地图时出错