Laravel in_array 验证规则

Posted

技术标签:

【中文标题】Laravel in_array 验证规则【英文标题】:Laravel in_array validation rule 【发布时间】:2016-12-17 10:06:22 【问题描述】:

我已经定义了一个数组

$this->allslots=array('10:00:00', '10:10:00', '10:20:00', '10:30:00', '10:40:00', '10:50:00', '11:00:00', '11:10:00', '11:20:00', '11:30:00', '11:40:00', '11:50:00', '12:00:00', '12:10:00', '12:20:00', '12:30:00', '12:40:00', '12:50:00', '13:00:00', '13:10:00', '13:20:00', '13:30:00', '13:40:00', '13:50:00', '14:00:00', '14:10:00', '14:20:00', '14:30:00', '14:40:00', '14:50:00', '15:00:00', '15:10:00', '15:20:00', '15:30:00', '15:40:00', '15:50:00', '16:00:00', '16:10:00', '16:20:00', '16:30:00', '16:40:00', '16:50:00');

现在,我想在将数据保存到数据库之前进行验证,如果给定的输入与上述数组的值之一匹配。为此我正在做

$this->validate($request, [

        'field' => 'required|in_array:$this->allslots',
    ]);

但是,这会为每个输入返回验证错误。那么,我该怎么做呢?

【问题讨论】:

【参考方案1】:

试试这个:

'field' => 'required|in:' . implode(',', $this->allslots),

【讨论】:

如果其中一个数组项包含逗号怎么办?那你真的完蛋了。 :)【参考方案2】:

这比公认的答案更具语义:

use Illuminate\Validation\Rule;

$this->allslots=array('10:00:00', '10:10:00', '10:20:00', '10:30:00', '10:40:00', '10:50:00', '11:00:00', '11:10:00', '11:20:00', '11:30:00', '11:40:00', '11:50:00', '12:00:00', '12:10:00', '12:20:00', '12:30:00', '12:40:00', '12:50:00', '13:00:00', '13:10:00', '13:20:00', '13:30:00', '13:40:00', '13:50:00', '14:00:00', '14:10:00', '14:20:00', '14:30:00', '14:40:00', '14:50:00', '15:00:00', '15:10:00', '15:20:00', '15:30:00', '15:40:00', '15:50:00', '16:00:00', '16:10:00', '16:20:00', '16:30:00', '16:40:00', '16:50:00');

$request->validate([
    'field' => [
        'required',
        Rule::in($this->allslots)
    ]
]);

【讨论】:

【参考方案3】:

我找到了更好的解决方案。 validate in_array 期望该数组是请求中的参数之一。如果数组中有逗号,则接受的答案将不起作用。要使用 in_array 而无需创建新规则,您只需执行以下操作:

$this->allslots=array('10:00:00', '10:10:00', '10:20:00', '10:30:00', '10:40:00', '10:50:00', '11:00:00', '11:10:00', '11:20:00', '11:30:00', '11:40:00', '11:50:00', '12:00:00', '12:10:00', '12:20:00', '12:30:00', '12:40:00', '12:50:00', '13:00:00', '13:10:00', '13:20:00', '13:30:00', '13:40:00', '13:50:00', '14:00:00', '14:10:00', '14:20:00', '14:30:00', '14:40:00', '14:50:00', '15:00:00', '15:10:00', '15:20:00', '15:30:00', '15:40:00', '15:50:00', '16:00:00', '16:10:00', '16:20:00', '16:30:00', '16:40:00', '16:50:00');

$request['allslots'] = $this->allslots;

validate($request, [

        'field' => 'required|in_array:allslots.*',
    ]);

确保在末尾包含 .*

【讨论】:

不简单(差不多),而且改变了请求数据。 也许“更简单”不是最好的词,但它确实解决了昏迷问题。接受的答案有一个很大的弱点,它假设没有逗号,所以它在某些情况下不起作用。我提出的解决方案不需要您创建任何额外的规则,而且它适用于任何情况。不,您不是在更改请求的数据,而是在“添加”一个字段,与添加 @method('PATCH') 没有太大区别。但是,我将删除“更简单”一词。【参考方案4】:

考虑添加:

use Illuminate\Validation\Rule; 

在这里找到:http://www.javaear.com/question/45810009.html

【讨论】:

以上是关于Laravel in_array 验证规则的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 有时验证规则

Laravel:模型内的验证。多重验证规则

laravel验证规则

Laravel 验证规则列表

Laravel 验证规则“不同”

Laravel 验证唯一规则反射类异常