php 是否有“不在场”的验证规则?

zzlelutf  于 2023-04-28  发布在  PHP
关注(0)|答案(6)|浏览(116)

我需要检查是否使用Laravel验证器在数组中设置密钥。
这与“必需的”验证规则完全相反。
基本上,如果数组通过验证,它将被传递给update方法,我想确保其中一列不会被更新。
是否有方法检查值“不存在”?
谢谢你

编辑:

我现在用的是Laravel 5

编辑:

我通过调用Validator::extendImplicit编写了自己的验证规则。但是,无论我将$value设置为null还是根本不设置它,我都将它作为null添加到验证函数中。有没有办法检查是否设置了值?

cwtwac6a

cwtwac6a1#

我想我找到了一个解决办法:

$validator->extendImplicit('not_present', function($attribute, $value, $parameters)
{
    return !array_key_exists($attribute, $this->data);
});

我不是静态调用extendImplicit,因为Validator类对象被注入到类的控制器中。
我需要访问$this-〉data($this指的是Validator对象)以确保键不存在于正在验证的数组中。

g52tjvyc

g52tjvyc2#

基于@MaGnetas的回答,我提出了这两条规则,可以应用于任何模型。我用的是Laravel 5。4所以把这几行放在你的AppServiceProvider.php上应该可以工作。

第一种方法extendImplicitarray_key_exists

Validator::extendImplicit('not_present', function($attribute, $value, $parameters, $validator)
{
    return !array_key_exists($attribute, $validator->getData());
});

使用$validator->getData(),我们可以静态地使用Validator。

第二种方法extendfalse

Validator::extend('not_present', function($attribute, $value, $parameters, $validator)
{
    return false;
});

您可以使用extend,因为如果数据没有属性,我们不需要执行规则(因为这正是我们想要的,对吗?)
关于文档:
默认情况下,当正在验证的属性不存在或包含所需规则定义的空值时,不运行常规验证规则(包括自定义扩展)。更多资讯

重要:唯一的区别是使用extend,空字符串将不会运行验证。但是如果您在中间件上设置了TrimStringsConvertEmptyStringsToNull(默认选项为AFAIK),则不会有任何问题

bjp0bcyl

bjp0bcyl3#

不,没有内置的验证规则,但您可以创建自己的验证规则。
最简单的方法是:

Validator::extend('foo', function($attribute, $value, $parameters)
    {
     // Do some stuff
    });

并检查密钥是否存在。更多信息: www.example.com

drnojrws

drnojrws4#

对于在7中寻找非当前逻辑的人。x apps(适用于所有版本),请记住,您可以简单地使用经过验证的数据数组来获得相同的结果。

$validatedKeys = $request->validate([
            'sort' => 'integer',
            'status' => 'in:active,inactive,archived',
        ]);

    // Only update with keys that has been validated.
    $model->update(collect($request->all())->only($validatedKeys)->all());

我的模型有更多的属性,但只有这两个应该是可更新的,因此我也在寻找一个not_present规则,但最终这样做的结果和概念逻辑是非常相同的。只是从另一个Angular 。

yrdbyhpb

yrdbyhpb5#

我知道这个问题很老了,但你也可以用

'email' => 'sometimes|required|not_regex:/^/i',

如果email出现在请求中,正则表达式将匹配请求中的任何字符,如果email是空字符串但出现在请求中,则有时会匹配**。|required**将捕获它。

atmip9wb

atmip9wb6#

从Laravel 8开始,有禁止字段的验证规则。这里有一个例子

Validator::make($data, [
    'is_minor' => true,
    'tos_accepted' => true
], [
    'tos_accepted' => 'prohibited_if:is_minor,true'
]);

Prohibited Validation Rules in Laravel
Laravel文档

相关问题