gerob/l4-validation

此软件包最新版本(0.6)的许可信息不可用。

0.6 2014-03-26 16:24 UTC

This package is not auto-updated.

Last update: 2024-09-28 15:57:05 UTC


README

简介

此软件包的创建旨在实现几个目的

  1. 简化验证服务的创建 - 我们都知道验证应该从控制器中移出
  2. 提供一个方便的方式来提供验证的上下文 - 例如,为编辑和创建提供修改后的验证规则集
  3. 提供一个方便的方式来分组验证 - 即通过调用一个 'passes()' 方法来验证多个模型
  4. 分支以允许更新框架

安装

通过Composer安装此软件包。将以下内容添加到您的composer.json文件中

"require": {
    "crhayes/validation": "dev-master"
}

接下来,运行composer install

最后,将服务提供者和外观添加到app/config/app.php中。

'providers' => array(
    // ...

    'Crhayes\Validation\ValidationServiceProvider'
)

'aliases' => array(
    // ...

    'GroupedValidator' => 'Crhayes\Validation\Facade'
)

作为服务的验证

最基本的验证器

要创建一个验证服务,只需扩展基本抽象上下文验证类,并提供一组规则和消息(消息将覆盖Laravel的默认验证消息)。

<?php

namespace App\Services\Validators;

use Crhayes\Validation\ContextualValidator;

class UserValidator extends ContextualValidator
{
    protected $rules = [
        'first_name' => 'required',
        'last_name' => 'required'
    ]

    protected $messages = [
        'first_name.required' => 'First name is required!'
    ]
}

此服务实例化后,验证的工作方式与Laravel内置验证非常相似。

use App\Services\Validators\UserValidator;

...

$userValidator = new UserValidator(Input::all());
OR
$userValidator = UserValidator::make(Input::all());

...

if ($userValidator->passes()) {
  // yay, successful validation
}

// nay, get the errors
$errors = $userValidator->errors();

上下文验证

提供上下文

有时你需要根据你在其中使用它的上下文为同一模型提供不同的规则。例如,有些字段在注册时可能是必需的,但在用户编辑其个人资料时可能不是。

我们可以将我们的规则数组转换为多维数组,并为每个上下文设置唯一的键。默认键表示默认规则,将用于每次验证。默认规则可以通过在其他上下文中设置规则来很容易地覆盖。

<?php

namespace App\Services\Validators;

use Crhayes\Validation\ContextualValidator;

class UserValidator extends ContextualValidator
{
    protected $rules = [
        'default' => [
            'first_name' => 'required',
            'last_name' => 'required'
        ],
        'create' => [
            'first_name' => 'required|max:255' // override default
        ],
        'edit' => [
            'website' => 'required|url' // add a new rule for website while editing
        ]
    ]
}

让我们看看如何在创建用户时使用其中一个上下文

use App\Services\Validators\UserValidator;

...

$userValidator = UserValidator::make(Input::all())->addContext('create');

if ($userValidator->passes()) {
  // yay, successful validation
}

// nay, get the errors
$errors = $userValidator->errors();

在编辑用户时,我们会这样做

use App\Services\Validators\UserValidator;

$userValidator = UserValidator::make(Input::all())->addContext('edit');

if ($userValidator->passes()) {
  // yay, successful validation
}

// nay, get the errors
$errors = $userValidator->errors();

还可以添加多个上下文

use App\Services\Validators\UserValidator;

$userValidator = UserValidator::make(Input::all())
    ->addContext(['create', 'profile']);

// or chained
$userValidator->addContext('create')->addContext('profile');

向上下文中提供数据

有时你需要向你的规则提供数据。例如,你可能有一个字段上的唯一规则,但在编辑记录时,你不想在用户提交包含他们先前值的表单时抛出错误。

幸运的是,我们有处理这些实例的方法。

<?php

namespace App\Services\Validators;

use Crhayes\Validation\ContextualValidator;

class UserValidator extends ContextualValidator
{
    protected $rules = [
        'default' => [
            'first_name' => 'required',
            'last_name' => 'required',
            'email' => 'required|email|unique:users,email'
        ],
        'edit' => [
            'email' => 'required|email|unique:users,email,@id'
        ]
    ]
} 

请注意,我们已将电子邮件字段默认设置为唯一。然而,当用户提交编辑表单时,我们希望忽略当前用户的id。我们使用@id占位符,并将其替换为所需的值

$userValidator = UserValidator::make(Input::all())
    ->addContext('edit')
    ->bindReplacement('email', ['id' => $currentUser->id]);

该方法bindReplacement()接受规则名称作为第一个参数;第二个参数是一个绑定数组,键是占位符,值是替换值。

分组验证器

你是否曾提交过需要创建或更新两个不同模型的数据的表单?验证两个模型可能会很痛苦,但这就是GroupedValidator类的作用。

假设我们提交了一个表单,该表单将创建一个新的用户和他们的汽车;因此,我们需要验证用户和汽车模型。

use App\Services\Validators\UserValidator;
use App\Services\Validators\CarValidator;
use Crhayes\Validation\GroupedValidator;

$userValidator = UserValidator::make(Input::only('first_name', 'last_name'));
$carValidator = CarValidator::make(Input::only('make', 'model'));

$groupedValidator = GroupedValidator::make()
    ->addValidator($userValidator)
    ->addValidator($carValidator);

if ($groupedValidator->passes()) {
  // yay, successful validation
}

// nay, get the errors
$errors = $groupedValidator->errors(); // return errors for all validators

我们也可以使用分组验证中的验证器上下文

$userValidator = UserValidator::make(Input::only('first_name', 'last_name'))
    ->addContext('create');
$carValidator = CarValidator::make(Input::only('make', 'model'))
    ->addContext('create');

$groupedValidator = GroupedValidator::make()
    ->addValidator($userValidator)
    ->addValidator($carValidator);

我们还可以混合使用上下文验证器服务和本机Laravel验证器

$userValidator = UserValidator::make(Input::only('first_name', 'last_name'));
$carValidator = Validator::make(Input::only('make', 'model'), [
    'make' => 'required',
    'model' => 'required'
]);

$groupedValidator = GroupedValidator::make()
    ->addValidator($userValidator)
    ->addValidator($carValidator);

添加自定义复杂验证

将复杂验证添加到您的验证服务就像以下这样做

<?php

namespace App\Services\Validators;

use Crhayes\Validation\ContextualValidator;

class UserValidator extends ContextualValidator
{
    protected $rules = [
        'default' => [
            'first_name' => 'required',
            'last_name' => 'required',
            'email' => 'required|email|unique:users,email'
        ],
        'edit' => [
            'email' => 'required|email|unique:users,email,@id'
        ]
    ]
    
    protected function addConditionalRules($validator)
    {
        $validator->sometimes('some_field', 'required' function($input)
        {
            // perform a check
        });
    }
} 

我们所做的只是将addConditionalRules($validator)方法添加到我们的验证服务中,该方法接受一个Illuminate\Validation\Validator实例,使我们能够利用Laravel对复杂验证的内建支持。