如果未选择任何选项,Laravel 将忽略选择输入验证

Posted

技术标签:

【中文标题】如果未选择任何选项,Laravel 将忽略选择输入验证【英文标题】:Laravel ignores select input validation if no option is selected 【发布时间】:2018-03-06 10:39:44 【问题描述】:

我有一个包含一些字段的表单,我想使用 Laravel 的 validate() 方法进行验证。

public function postSomething(Request $req) 

    ...

    $this->validate($req, [
        'text_input' => 'required',
        'select_input' => 'required'
    ]);

    ...


问题是,如果表单在没有从选择输入中选择选项的情况下提交,它会在请求中被忽略,并且 Laravel 不会验证它,尽管它是使用 required 验证规则添加到规则集中的.正在正确验证空文本输入。

+request: ParameterBag #42 ▼
  #parameters: array:1 [▼
    "text_input" => ""
    "_token" => "TCDqEi2dHVQfmc9HdNf8ju1ofdUQS6MtDBpUMkl7"
  ]

如您所见,如果 select_input 为空,则请求参数中会丢失它。

这是我的选择输入的 html 代码:

<select class="form-control" name="select_input">
    <option disabled selected>Please select...</option>
    <option value="val1">Value 1</option>
    <option value="val2">Value 2</option>
</select>

有没有办法使规则集中的所有字段的验证工作,即使其中一些字段不存在于请求中?

来自 Laravel 5.1 验证文档:

必填

验证中的字段必须存在于输入数据中且不能为空。一个字段被认为是“空的”是以下条件之一为真: 该值为空。 该值是一个空字符串。 该值是一个空数组或空 Countable 对象。 该值是一个没有路径的上传文件。

附:我使用的是 Laravel 5.1,所以 present 方法不可用。

【问题讨论】:

显示您的 HTML 代码 这无济于事,因为null 输入不包含在请求正文中是一种预期行为。无线电输入和复选框也会发生这种情况。 显示您的刀片模板。 value="" 添加到 &lt;option disabled selected&gt;Please select...&lt;/option&gt; 并且您的规则应类似于 'select_input' =&gt; 'required|in:val1,val2' ;) @Maraboc 我之前尝试过,但似乎该字段的任何验证都被忽略了,因为它不存在于请求参数中。似乎只有 Laravel 5.2 中的 present 验证方法可以工作,但不幸的是我无法将项目升级到较新的版本,因为我需要更改很多东西...... 【参考方案1】:

你的 html 应该是这样的

<select class="form-control" name="select_input">
    <option value="" selected >Please select...</option>
    <option value="val1">Value 1</option>
    <option value="val2">Value 2</option>
</select>

$this->validate($req, [
        'text_input' => 'required',
        'select_input' => 'required',
    ]);

如果您的选择框值是整数,那么 您可以将requiredinteger 一起使用

$this->validate($req, [
    'text_input' => 'required',
    'select_input' => 'required|integer',
]);

或者,如果您对该选择框的选项有限,那么您可以使用

'select_input' => "required|in:val1,val2,val3",

【讨论】:

你的选项值是字符串吗?如果是这样,那么使用required|string 是的,这些值是字符串,但validate 方法似乎仍然忽略了请求中未包含的任何输入。 在我添加到答案时更改您的 html 它确实可以在没有 disabled 属性和空值的情况下工作。 :)【参考方案2】:

您已禁用它的选项,因此它不会通过您的表单发送任何内容。

将您的选择框更改为

<select class="form-control" name="select_input">
    <option value="">Please select...</option>
    <option value="val1">Value 1</option>
    <option value="val2">Value 2</option>
</select>

【讨论】:

我忘了说我使用的是 Laravel 5.1,它不包含这个验证规则,很遗憾。 在您的问题中分享您的选择框html【参考方案3】:

我可以推荐几个选项:

手动验证请求而不使用Controller中扩展的验证,即:

//validator FACADE
$ validator = Validator::make ($request->all(), [
    // rules here
]);

通过这个可以监控哪些字段通过了,哪些没有通过。

其次,为选择列表设置一个默认值,并在 Controller 中进行验证时检查该值,也就是说,如果您有此默认值,则不会选择任何内容。您肯定只会在 Controller 中提交字段。

【讨论】:

以上是关于如果未选择任何选项,Laravel 将忽略选择输入验证的主要内容,如果未能解决你的问题,请参考以下文章

如果未选择任何选项,则多选返回“null”

Laravel Livewire:在选择输入的更改上传递选项值

Laravel selectRange 空白选项

Laravel Livewire:输入选择,选择默认选项

foreach 选择未正确设置默认选项

仅当使用 parsleyjs 选择选项 radio 时才需要验证表单