【问题标题】:How to create a custom exclude validation rule in Laravel如何在 Laravel 中创建自定义排除验证规则
【发布时间】:2021-12-24 02:22:49
【问题描述】:

我想创建一个在某些条件下排除属性的自定义规则,我能想到的唯一方法是:

  1. 手动验证 FormRequest 中的条件,如果我的条件是 ture 则添加“排除”规则(即 imo,不太优雅)
  2. (我不确定这是否有效/不会产生副作用)创建一个自定义验证规则,如果条件为真,该规则将从请求中删除属性 (request->remove($attribute))。
    有没有更好的方法来做到这一点?

我也找不到任何排除规则的实现。

【问题讨论】:

  • 这有点含糊,我认为这听起来不像是一项验证工作,而是一个简单的 if 检查。
  • 是的,但我想知道我是否可以为此创建自定义规则...类似于 new ExcludeWhenMySoComplicatedConditionIstrue
  • 您可以按照此处Laravel | Custom Validation Rules 的文档创建自定义验证规则。但是看到你没有为你的问题定义任何参数,我不知道如何回答它。我相信您还应该查看Laravel | Available Validation Rules 以查找您需要的条件逻辑。

标签: laravel validation


【解决方案1】:

这是与您的模糊问题相匹配的模糊答案,但使用conditional complex validation 可以轻松完成。在应用规则之前使用the withValidator() method 访问验证器实例。

// assuming we're inside a FormRequest
public function withValidator($validator)
{
    $validator->sometimes(
        'some_field',
        'required|string|max64',
        fn ($data) => $data->some_other_field !== 1234
    );
}

sometimes() 的第一个参数是您要有条件地验证的字段;第二个是您要应用的规则;第三个是回调。回调传递请求数据;如果返回 true,则应用规则。

【讨论】:

  • 这正是我想要的,谢谢!不过,我有 2 个问题: 1- 我必须在 withValidator 中使用它,而不是在 rules() 方法中使用 $this->validator 吗? 2-“排除”规则是如何实施的?是不是类似于 $this->request->remove('attribute') ?
  • 我没有尝试在rules() 方法中访问验证器实例,但是有一个受保护的方法FormRequest::getValidatorInstance() 可能比仅仅尝试访问属性更安全。 exclude 规则不会从请求中删除项目,只是从 FormRequest::validated() 返回。
  • 啊,谢谢!知道如何手动从验证数据中删除属性吗?
  • FormRequest::validated() 返回一个简单的数组;使用unset() 删除元素很容易。
  • 啊,好的,谢谢!
【解决方案2】:

有很多方法可以根据条件排除验证规则。

您可以使用exclude_ifexclude_unlessexclude_without

假设你想排除一个字段验证,如果它的另一个字段的值为空,那么你可以使用

['field1' => 'exclude_if:field2,null|<validation rules for field1>'] 

再次假设您要排除一个字段验证,除非另一个值不等于 3,然后使用,

['field1' => 'exclude_unless:field2,==,3|<validation rules for field1>'] 

【讨论】:

  • 感谢您的回答,但我正在寻找更复杂条件的东西,@miken32 回答很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-25
  • 2017-12-01
  • 1970-01-01
  • 2017-04-11
  • 2018-02-18
  • 2012-01-01
  • 1970-01-01
相关资源
最近更新 更多