Laravel5のカスタムバリデーション(ルールオブジェクト)

Validationクラスの拡張という手法から、ルールオブジェクトを使うことを推奨するように変わったっぽいです。
カスタムバリデーションルール ルールオブジェクトの使用

php artisan make:rule FooBar

approot/app/Rules/FooBar.phpが作成されます。作成されたFooBar.phpにバリデーションルールを記述します。passes()メソッドにルールを記述し、message()にエラーメッセージを書きます。passes()メソッドは、その内部での条件式がtrueの場合はバリデーションを通しfalseの場合はエラーにします。message()はリターンにメッセージをそのまま書けばOKです。アトリビュートも使えます。

<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class FooBar implements Rule
{
    /**
     * Create a new rule instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        //
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return 'The validation error message.';
    }
}

実際にコントローラ上で使う場合には、パイプで使えないというのが難点。とはいえLaravelのバリデーションは配列で表現できるので、配列に書き換えてしまえば問題ないです。またオブジェクトルールをひとつひとつuseしておくことを忘れずに!

use App\Rules\FooBar;

....

$request->validate([
      'name' => ['required','max:32', new FooBar], ←こんなようにして追加できます。
      'email'    => ['required','email'],
]);

挙動は他のデフォルトのバリデーションと同じで422で返ります。


Laravel5.6 バリデーション カスタムバリデーションルール ルールオブジェクトの使用
【Laravel5.6】カスタムバリデーションはルールオブジェクトを使おう
Laravelでバリデーションルールを配列で指定する方法

Last update: 2019.07.12 (金)