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 必須被接受。", // 其他的驗證錯誤消息...
當你在建立自定義驗證規則時,你可能須要定義佔位符來取代錯誤消息。你能夠像上面所描述的那樣經過 Validator
Facade 來使用 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