samrap/laravel-validation

增强Laravel请求输入的验证。

v2.0.0 2016-07-30 16:24 UTC

This package is not auto-updated.

Last update: 2024-09-14 18:58:28 UTC


README

StyleCI Build Status Latest Stable Version Total Downloads Latest Unstable Version License

Laravel 验证

Laravel Validation 是一个针对 Laravel 框架的简单、最小化验证包。它的唯一目的是将你的请求验证规则与模型和控制器分离,这些组件都不应该包含此类信息。它通过本质上充当验证规则与 Laravel 验证器实例之间的经纪人来实现这一点。

public function store(Request $request, ModelValidator $validator)
{
    $validator = $validator->validate($request->all());
    $this->validateWith($validator, $request);

    ...
}

但我正在使用表单请求

如果你正在使用 表单请求,那么这个包将没有用。如果你想在你控制器内显式验证请求,但又想保持验证规则分离,那么尝试 Laravel Validation 吧!

安装

通过 Composer 安装

composer require samrap/laravel-validation

然后将服务提供者添加到你的 providers 数组中,在 config/app.php

Samrap\Validation\ValidationServiceProvider::class

最后,需要将基本 Validator 类发布到新的 app/Validators 目录。这可以通过使用 vendor:publish 命令来完成

php artisan vendor:publish --provider="Samrap\Validation\ValidationServiceProvider"

使用

所有验证器都位于 app/Validators 目录中,并扩展了类 App\Validators\Validator。每个模型应该有一个验证器类。例如,User 模型的验证器可以命名为 UserValidator

Laravel Validation 提供了一个有用的 artisan 命令,用于动态生成新的验证器。让我们为我们的 User 模型创建一个验证器并定义一些规则

php artisan make:validator UserValidator

这将创建一个位于 app/Validators 目录中的新的 UserValidator 类,如下所示

namespace App\Validators;

use App\Validators\Validator;

class UserValidator extends Validator
{
    /**
     * The validation rules.
     *
     * @var array
     */
    protected $rules = [];
}

每个验证器都有一个 rules 属性,它(恰当地)包含了针对预期模型的所有验证规则。让我们为这个验证器定义一些基本规则

/**
 * The validation rules.
 *
 * @var array
 */
protected $rules = [
    'email' => 'email|required|max:255|unique:user',
    'password' => 'min:8|confirmed',
];

太棒了!我们现在有一个名为 UserValidator 的验证器类,其中包含了我们在控制器中想要验证的规则。让我们跳转到 UserController 来看看如何使用这个新的验证器类。

首先,我们希望将这个类导入到我们的控制器中

use App\Validators\UserValidator

现在,让我们验证控制器 store 方法的 POST 请求

public function store(Request $request, UserValidator $validator)
{
    $validator = $validator->validate($request->all());
    $this->validateWith($validator, $request);

    ...
}

这里发生了一些事情。让我们逐行分析。

首先,除了当前请求之外,我们还在类型提示一个我们的 UserValidator 实例,因为它具有依赖关系,应该通过服务容器来解决

public function store(Request $request, UserValidator $validator)

我们的验证器从其父类 Samrap\Validation\Validator 继承了 validate 方法,我们可以使用它来获取一个 Illuminate\Validation\Validator 实例。我们的 validate 方法接受与使用 Laravel 的 Validator::make 方法(稍后详细介绍)手动创建验证器相同的参数。因此,我们将简单地传递请求输入到 $validator->validate() 方法

$validator = $validator->validate($request->all());

最后,我们可以使用 Laravel 的 ValidatesRequests 特性,它默认包含在所有控制器中。它为我们提供了一个 validateWith 方法,它期望一个验证器实例和请求,如果验证失败,将处理重定向

$this->validateWith($validator, $request);

就这样!这就是你需要做的所有请求验证。验证器将使用在 UserValidator 中定义的规则来验证请求,在你的控制器中只需要两行代码。显然,随着你需要进行的验证数量的增加,这极大地清理了你的控制器。

当然,在某个请求中,你可能需要添加或覆盖你在验证器中定义的一些规则。别担心,这非常简单!

$validator = $validator->validate($request->all(), [
    'name' => 'string|required',
]);

在这种情况下,我们正在为 name 字段添加一个规则,该规则将与我们在 UserValidator 中定义的规则合并。默认情况下,任何显式传递给 validate 方法的规则,如果存在,将覆盖验证器中定义的规则。

附加功能

多个规则集

Laravel 验证期望在验证器类上有一个 rules 属性,但在特定情况下,可以定义额外的属性并使用它们。当你更新记录与存储时,你可能有不同的要求,或者如果用户具有特定角色,可能会有独特的规则。

让我们在 App\Validators\UserValidator 类上定义一个 updating 属性,为更新用户定义特定的规则

protected $updating = [
    // rules...
];

然后在控制器中的 update 方法中,我们可以调用验证器的 using 方法,并传递我们想要验证的属性的名称

public function update(Request $request, UserValidator $validator)
{
    $validator = $validator->using('updating')->validate($request->all());
    $this->validateWith($validator, $request);

    ...
}

通过在 validate 之前调用 using 方法,我们告诉验证器使用 updating 属性而不是默认的 rules

贡献

欢迎贡献!你可以将功能请求提交到 rapaport.sam7@gmail.com,或者自己分叉仓库!