自定義驗證規則物件( Laravel 5.5 新功能早知道)

JokerLinly發表於2017-07-15

file
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 可以知道它是如何實現和測試的。

參考連結:https://laravel-news.com/custom-validation-rule-objects

Stay Hungry, Stay Foolish.

相關文章