laravel5.2 バリデーションを自作 (カスタムバリデーション)

フォームに入力された文字に、 test という文字列が入ってないとエラーというバリデーションパターンを作りたいとする。

自作のバリデートパターンを書くクラスを作る

App/ の下に Validator というディレクトリを掘って、そこに CustomValidation.php を作成。 \Illuminate\Validation\Validator を継承しなきゃダメらしい。

<?php
namespace App\Validator;

class CustomValidation extends \Illuminate\Validation\Validator
{

    public function validateTestStringCheck($attribute, $value, $parameters)
    {
        $pos = strpos($value, 'test');

        if ($pos === false) {
            return false;
        } else {
            return true;
        }
    }
}

メソッド名に命名規則があり、プリフィクスに validate を付与とのこと。 そのあとの TestStringCheck がバリデートパターン名になるみたい。

※ 余談だが、CustomValidation.php なら class名は CustomValidation じゃなきゃダメ。当たり前だけど。なんでこんな事書くかというと、ファイル名を CustomValidate.php にしてて not found でてしばらくハマった…

サービスプロバイダでboot時にこの自作のバリデートを合体させる

AppServiceProvider.php に書いてもいいのかな? わからなかったので、僕は ValidatorServiceProvider.php を artisan で作った。

php artisan make:provider ValidatorServiceProvider
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Validator\CustomValidation;

class ValidatorServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        \Validator::resolver(function ($translator, $data, $rules, $messages) { // (1)
            return new CustomValidation($translator, $data, $rules, $messages);
        });
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

(1)の resolver ってのが合体のメソッドみたい。 できたら、 config/app.php の providers にも追加。

あとは使うだけ

Request作って、そこにメッセージ書いた。

<?php

namespace App\Http\Requests;

use App\Http\Requests\Request;

class SampleRequest extends Request
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'test' => "required|testStringCheck"
        ];
    }

    public function messages()
    {
        return [
            'test.test_string_check' => 'testという文字列が入ってません。'
        ];
    }
}

※ なぜかわからないけど、Request に message と attribute 書いたらうまく反映されなかった。おとなしく resource/lang/ja/validation.php にかいたらうまくいきました。