Laravel 5.5 支援自定義驗證規則物件,以此作為使用 Validator::extend
進行 自定義驗證規則 的替代方法。
先實現 Illuminate\Contracts\Validation\Rule
介面或使用 Closure
來定義自定義驗證規則。 然後自定義規則就可以直接用於驗證器。
自定義物件驗證規則的例子:
use Illuminate\Contracts\Validation\Rule;
class CowbellValidationRule implements Rule
{
public function passes($attribute, $value)
{
return $value > 10;
}
public function message()
{
return ':attribute needs more cowbell!';
}
}
定義自定義規則後,就可以在控制器驗證中使用它,如下所示:
public function store()
{
// Validation message would be "song needs more cowbell!"
$this->validate(request(), [
'song' => [new CowbellValidationRule]
]);
}
使用 Closure 的例子:
public function store()
{
$this->validate(request(), [
'song' => [function ($attribute, $value, $fail) {
if ($value <= 10) {
$fail(':attribute needs more cowbell!');
}
}]
]);
}
如果請求中不存在 song
欄位,或者為空,那自定義的規則就不會執行。 如果要即使值為空的時候使用自定義驗證物件,那就要使用 ImplicitRule 契約 (contracts)。
use Illuminate\Contracts\Validation\ImplicitRule;
class CowbellValidationRule implements ImplicitRule
{
public function passes($attribute, $value)
{
return $value > 10;
}
public function message()
{
return ':attribute needs more cowbell!';
}
}
如果你更想在類中組織自定義規則,那自定義驗證規則物件會是 Validator::extend()
風格的自定義規則的絕佳選擇。另外,從驗證器跳轉到規則原始碼可以比使用 Validator::extend()
定義的基於字串的自定義規則更方便。
Closure
風格的自定義驗證規則應用於簡單的一次性需求那可是極好的,實際上在不離開控制器的情況下測試自定義驗證規則是非常方便的。 可以使用 Closure 來測試自定義規則,如果規則被證明是有用的,再將其移動到物件中去。
檢視這個功能的 PR 可以知道它是如何實現和測試的。
本作品採用《CC 協議》,轉載必須註明作者和本文連結