laravel 设置自定义 Validator

转自:https://learnku.com/docs/laravel/5.4/validation/1234#custom-validation-rules

自定义验证规则

Laravel 提供了许多有用的验证规则。但你可能想自定义一些规则。注册自定义验证规则的方法之一,就是使用 Validator Facade 中的 extend 方法,让咱们在 服务提供者 中使用这个方法来注册自定义的验证规则:php

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Validator;

class AppServiceProvider extends ServiceProvider
{
    /**
     * 启动任意应用程序服务。
     *
     * @return void
     */
    public function boot()
    {
        Validator::extend('foo', function ($attribute, $value, $parameters, $validator) {
            return $value == 'foo';
        });
    }

    /**
     * 注册服务容器。
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

 

自定义的验证闭包接收四个参数:要被验证的属性名称 $attribute,属性的值 $value,传入验证规则的参数数组 $parameters,及 Validator 实例。laravel

除了使用闭包,你也能够传入类和方法到 extend 方法中:数组

Validator::extend('foo', 'FooValidator@validate');
 

自定义错误消息

另外你可能还须要为自定义规则来定义一个错误消息。这能够经过使用自定义内联消息数组或是在验证语言包中加入新的规则来实现。此消息应该被放在数组的第一级,而不是被放在 custom 数组内,这是仅针对特定属性的错误消息:闭包

"foo" => "你的输入是无效的!",

"accepted" => ":attribute 必须被接受。",

// 其他的验证错误消息...

 

当你在建立自定义验证规则时,你可能须要定义占位符来取代错误消息。你能够像上面所描述的那样经过 ValidatorFacade 来使用 replacer 方法建立一个自定义验证器。经过 服务提供者 中的 boot 方法能够实现:ide

/**
 * 启动任意应用程序服务。
 *
 * @return void
 */
public function boot()
{
    Validator::extend(...);

    Validator::replacer('foo', function ($message, $attribute, $rule, $parameters) {
        return str_replace(...);
    });
}
 

隐式扩展功能

默认状况下,如有一个相似 required 这样的规则,当此规则被验证的属性不存在或包含空值时,其通常的验证规则(包括自定扩展功能)都将不会被运行。例如,当 integer 规则的值为 null 时 unique 将不会被运行:ui

$rules = ['name' => 'unique'];

$input = ['name' => null];

Validator::make($input, $rules)->passes(); // true

若是要在属性为空时依然运行此规则,则此规则必须暗示该属性为必填。要建立一个「隐式」扩展功能,能够使用 Validator::extendImplicit() 方法:spa

Validator::extendImplicit('foo', function ($attribute, $value, $parameters, $validator) {
    return $value == 'foo';
});

{note} 一个「隐式」扩展功能只会 暗示 该属性为必填。它的实际属性是否为无效属性或空属性主要取决于你。code

相关文章
相关标签/搜索