inflection-points/laravel-validation-rulesets

保持您的 Laravel 验证规则更简洁的一种简单方法。

v0.5.4 2022-04-29 16:42 UTC

README

Latest Version on Packagist Build Status Quality Score Total Downloads

此包提供了一种相对简单的方式来组织、重用和简化您的 Laravel 验证规则。它是在与 Laravel 合作了一段时间后,尤其是在构建一个同时使用 Laravel Nova 管理资源的 API 时创建的。需要在 Laravel Nova 的每个字段上提供验证。在 API 方面,也需要提供相同的验证规则。这些规则可以是基于字段的,也可以是基于资源的。

因此,通过使用此包,可以创建两种类型的可重用规则集。第一种类型的规则集被称为字段规则集。字段规则集是一个实现了 Illuminate\Contracts\Validation\Rule 接口的类。它可以包含任意数量的 Laravel 验证规则,以及任何其他实现了 Illuminate\Contracts\Validation\Rule 的规则。

第二种类型的规则集被称为资源规则集。这实际上与 Laravel 中现有的任何内容都没有直接关系。它是一种方便的方式,用于按资源分组规则。它提供了更新和创建的常见规则以及特定于创建和更新的规则。这与 Laravel Nova 对单个字段的行为非常相似。目前,创建和更新规则合并了任何常见的规则,这与 Laravel Nova 处理资源字段的方式相同。

这些新类的结果是,可以更容易地将字段和资源特定的规则放入单独的类中,然后可以以许多可能更喜欢的这种方式使用、重用和测试。

安装

您可以通过 composer 安装此包

composer require inflection-points/laravel-validation-rulesets

字段规则集

字段规则集旨在成为一个验证规则对象,可以用于验证单个字段或属性。它类似于实现了 Illuminate\Contracts\Validation\Rule 的 Laravel 验证对象。主要区别在于,这些字段规则集允许用户在集合中列出一个或多个将应用于字段或属性的验证规则。代码本身受到了 Juampi Barreto 的 medium.com 文章 "Laravel 5.5 validation ruleception (rule inside rule)" 的启发。

很多时候,相同的少量验证规则需要应用于给定的字段,如电子邮件地址或密码等。每次需要时输入 'required|email|max:255》当然很容易。也有可能创建一个简单地实现了 Illuminate\Contracts\Validation\Rule 的验证规则,但这需要自己编写所有的各种验证代码,尽管它已经在 Laravel 框架中存在。

因此,现在可以简单地创建一个新的字段规则集,并提供应应用的各个验证规则。这个类现在是相当便携的,可重用,并且易于测试。

创建一个新的字段规则集

该包包括一个 artisan 命令来创建一个新的字段规则集。

php artisan make:field-rule-set EmailRuleSet

此字段规则集将具有 App\Rules\FieldRuleSets 命名空间,并保存在 app/Rules/FieldRuleSets 中。

您还可以指定一个自定义命名空间,例如 App\MyFieldRules

php artisan make:field-rule-set MyFieldRules/EmailRuleSet

此字段规则集将具有 App\MyFieldRules 命名空间,并保存在 app/MyFieldRules 中。

无论如何,您最终都会得到一个类似下面的文件

<?php

namespace App\Rules\FieldRuleSets;

use Telkins\Validation\AbstractFieldRuleSet;

class EmailRuleSet extends AbstractFieldRuleSet
{
    public function rules() : array
    {
        return [
            // ...
        ];
    }
}

只需简单填写各种应应用于要验证字段的验证规则即可。例如

public function rules() : array
{
    return [
        'email',
        'max:255',
    ];
}

您还可以使用其他字段规则集,任何实现了 Illuminate\Contracts\Validation\Rule 的对象,或者闭包。唯一需要注意的是,要将每个规则作为数组中的单独元素。

隐式规则

根据Laravel 关于使用隐式扩展的文档,“为了在属性为空时运行规则,规则必须暗示该属性是必需的。” 默认情况下,以下代码显示 Laravel 考虑哪些规则是隐式的

/**
 * The validation rules that imply the field is required.
 *
 * @var array
 */
protected $implicitRules = [
    'Required', 'Filled', 'RequiredWith', 'RequiredWithAll', 'RequiredWithout',
    'RequiredWithoutAll', 'RequiredIf', 'RequiredUnless', 'Accepted', 'Present',
];

当需要使用这些隐式规则之一或多个与字段规则集一起时,有两种方法可以这样做

  • 在字段规则集 使用隐式规则,但请确保字段规则集类实现了 Illuminate\Contracts\Validation\ImplicitRule。这仅向 Laravel 的验证器表明它实际上是一个隐式规则。
  • 而不是在字段规则集 使用隐式规则,移除它,并在对象旁边放置它。

例如,此字段规则集使用 required 并通过 ImplicitRule 接口向 Laravel 的验证器表明它是隐式的

<?php

namespace App\Rules\FieldRuleSets;

use Telkins\Validation\AbstractFieldRuleSet;
use Illuminate\Contracts\Validation\ImplicitRule;

class EmailRuleSet extends AbstractFieldRuleSet implements ImplicitRule
{
    public function rules() : array
    {
        return [
            'required',
            'email',
            'max:255',
        ];
    }
}

可以使用以下 artisan 命令,带上 implicit 选项,来创建一个新的字段规则集,该规则集实现了 Illuminate\Contracts\Validation\ImplicitRule

php artisan make:field-rule-set EmailRuleSet --implicit

另一种选择是 在字段规则集内使用 requiredIlluminate\Contracts\Validation\ImplicitRule,而是在使用字段规则集对象时,将其 放置。以下是从表单请求中使用的示例

/**
 * Get the validation rules that apply to the request.
 *
 * @return array
 */
public function rules()
{
    return [
        'email_address' => ['required', new EmailAddressRuleSet()],
        // ...
    ];
}

用法

要在表单请求中使用字段规则集

/**
 * Get the validation rules that apply to the request.
 *
 * @return array
 */
public function rules()
{
    return [
        'email_address' => [new EmailAddressRuleSet()],
        'subject' => 'required|string|max:255',
        'message' => 'required|string',
    ];
}

要在可能需要整个请求数据上下文的表单请求中使用字段规则集

/**
 * Get the validation rules that apply to the request.
 *
 * @return array
 */
public function rules()
{
    return [
        'email_address' => [new EmailAddressRuleSet($this->all())],
        'subject' => 'required|string|max:255',
        'message' => 'required|string',
    ];
}

当需要应用需要更大请求上下文的验证规则时,这是必要的。例如,如果您想使用 confirmed 验证规则,那么对象需要能够访问 所有 的请求属性及其值。只需将这些数据传递给构造函数即可。

要排除一个或多个规则

/**
 * Get the validation rules that apply to the request.
 *
 * @return array
 */
public function rules()
{
    return [
        'email_address' => [(new EmailAddressRuleSet())->except('required')],
        'subject' => 'required|string|max:255',
        'message' => 'required|string',
    ];
}

资源规则集

资源规则集旨在封装所有用于验证新或更新资源的规则。它是一组属性及其应应用于它们的各种规则,以进行验证。资源规则集从 Laravel Nova 的验证中获得一些灵感,允许用户定义“通用”规则、创建规则和更新规则。创建规则和更新规则会合并任何可能定义的“通用”规则。

创建新的资源规则集

该包包括一个 artisan 命令来创建新的资源规则集。

php artisan make:resource-rule-set BlogPost

此资源规则集将具有 App\Rules\ResourceRuleSets 命名空间,并保存在 app/Rules/ResourceRuleSets 中。

例如,您还可以指定一个自定义命名空间,如 App\MyResourceRules

php artisan make:resource-rule-set MyResourceRules/BlogPost

此资源规则集将具有 App\MyResourceRules 命名空间,并保存在 app/MyResourceRules 中。

无论如何,您最终都会得到一个类似下面的文件

<?php

namespace App\Rules\ResourceRuleSets;

use Telkins\Validation\AbstractResourceRuleSet;

class BlogPost extends AbstractResourceRuleSet
{
    /**
     * Provide rules that should be applied during creation and updating. If
     * empty, then this method can be removed.
     *
     * @return array
     */
    protected function provideRules() : array
    {
        return [
            // ...
        ];
    }

    /**
     * Provide rules that should be applied only during creation. If empty,
     * then this method can be removed.
     *
     * @return array
     */
    protected function provideCreationRules() : array
    {
        return [
            // ...
        ];
    }

    /**
     * Provide rules that should be applied only during updating. If empty,
     * then this method can be removed.
     *
     * @return array
     */
    protected function provideUpdateRules() : array
    {
        return [
            // ...
        ];
    }
}

只需填写特定资源的各种验证规则即可。例如

protected function provideRules() : array
{
    return [
        'subject' => [
            'string',
            'max:255',
        ],
        'body' => [
            'string',
            'max:1024',
        ],
    ];
}

protected function provideCreationRules() : array
{
    return [
        'author_id' => [
            'required',
        ],
        'subject' => [
            'required',
        ],
    ];
}

protected function provideUpdateRules() : array
{
    return [
        'reason' => [
            'required',
            'string',
            'max:255',
        ],
    ];
}

您还可以使用字段规则集,任何实现了 Illuminate\Contracts\Validation\Rule 的对象,或闭包。唯一需要注意的是,要将每个规则作为数组中的单独元素。

用法

返回资源规则集的“通用”规则

(new BlogPost())->rules();

返回资源规则集的创建规则

(new BlogPost())->creationRules();

返回资源规则集的更新规则

(new BlogPost())->updateRules();

在处理存储新博客文章的表单请求中使用资源规则集

/**
 * Get the validation rules that apply to the request.
 *
 * @return array
 */
public function rules()
{
    return (new BlogPost())->creationRules();
}

返回资源规则集对单个字段的“常规”规则

(new BlogPost())->rules('subject');

返回资源规则集对单个字段的创建规则

(new BlogPost())->creationRules('subject');

返回资源规则集对单个字段的更新规则

(new BlogPost())->updateRules('subject');

测试

composer test

变更日志

请参阅变更日志了解最近的变化信息。

贡献

请参阅贡献指南获取详细信息。

鸣谢

许可协议

MIT 许可协议 (MIT)。有关更多信息,请参阅许可文件