telkins/laravel-validation-rulesets

一种简单的方式来保持您的 Laravel 验证规则更加 DRY。

v0.6.0 2022-05-31 20:05 UTC

This package is auto-updated.

Last update: 2024-08-30 01:07:19 UTC


README

Latest Version on Packagist Build Status Quality Score Total Downloads

此包提供了一种相对简单的方式来组织、重用和DRY化您的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 telkins/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)。请参阅许可证文件以获取更多信息。