samrap / laravel-validation
增强Laravel请求输入的验证。
Requires
- php: >=5.5.9
- illuminate/console: ^5.2
- illuminate/support: ~5.1
- illuminate/validation: ^5.2
- phpunit/phpunit: ^4.8
Requires (Dev)
- mockery/mockery: ^0.9.4
This package is not auto-updated.
Last update: 2024-09-14 18:58:28 UTC
README
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,或者自己分叉仓库!