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 にかいたらうまくいきました。