【问题标题】:Adding validation rule only if all other rules pass, or stop validating entire set of attributes on the first error in Laravel 5.7仅当所有其他规则都通过时才添加验证规则,或者在 Laravel 5.7 中的第一个错误时停止验证整个属性集
【发布时间】:2019-06-13 00:32:46
【问题描述】:

我想允许用户在本地存储磁盘上创建一个文件夹。所以发送到服务器的表单比较简单,具有三个属性:

  1. new-folder-name - 这是要创建的文件夹的名称,
  2. relative-path - 相对于 asset 根目录创建新目录的目录路径,以及
  3. asset_id - asset的id,我需要这个id来获取asset的根目录。

问题是当我验证这些属性时,我还需要检查用户要创建的文件夹是否已经存在。为此,我制定了一条名为FolderExists 的规则。所以,在我运行 FolderExists 之前,我必须确保所有其他规则都已成功通过,因为我的自定义规则应该接受 relative-pathasset_id 才能构建检查的路径。

这是我的rules() 函数,我正在自定义表单请求中进行验证:

public function rules()
{
    return [
        'asset_id' => ['bail', 'required', 'exists:assets,id'],
        'relative-path' => ['bail', 'required', 'string'],
        'new-folder-name' => ['bail', 'required', 'string', 'min:3', new FolderName, new FolderExists($this->input('asset_id'), $this->input('relative-path')]
    ];
}

所以我的问题是:

只有当所有其他验证规则都通过时,是否可以添加FolderExists

或者,当验证器遇到第一个错误时,可能会停止整个验证?

这两个选项都应该没问题。

谢谢!

【问题讨论】:

  • 应该是工作无法理解为什么会失败,你确定它失败了吗?并且您在验证时遇到所有三个错误而不是一个
  • @LouisR 谢谢,但我已经检查了文档,尤其是在此之前在这里写我的问题。关于 required_if 的文档说“如果 anotherfield 字段等于任何 ,则验证中的字段必须存在且不为空。”我认为这不是我的情况。

标签: laravel validation laravel-5.7 customvalidator


【解决方案1】:

我自己终于找到了解决方案。这是我最终得到的结果。

为了达到预期的结果,我在自定义表单请求的withValidator() 方法中创建了另一个验证器,第二个验证器将仅处理FolderExists 规则,并且仅在之前的验证失败时处理。

public function rules()
    {
        return [
            'asset-id' => ['bail', 'required', 'integer', 'exists:assets,id'],
            'relative-path' => ['bail', 'required', 'string'],
            'new-folder-name' => ['bail', 'required', 'string', 'min:3', 'max:150', new FolderName]
        ];
    }

public function withValidator($validator)
    {
        if (!$validator->fails())
        {
            $v = Validator::make($this->input(),[
                'new-folder-name' => [new FolderExists($this->input('asset-id'), $this->input('relative-path'))]
            ]);
            $v->validate();
        }
    }

如果我们的主验证器通过,我们将创建另一个验证器并仅传递 FolderExists 规则及其参数,这些参数已被验证,并调用 validate() 方法。就是这样。

【讨论】:

    猜你喜欢
    • 2016-09-21
    • 1970-01-01
    • 2011-06-17
    • 2017-09-24
    • 2016-05-13
    • 2021-04-18
    • 2020-12-29
    • 2021-03-01
    • 1970-01-01
    相关资源
    最近更新 更多