Laravelのカスタムバリデーション
Laravelの独自バリデーション実装について
※Laravel5.2で検証
Laravelには予め用意されているValidationルールがいくつかあり、基本的なウェブアプリケーションでは既存のルールでまかなえる場合が多いです。
Laravel – Validation – Available Validation Rules
用意されているバリデーションルールで対応できない場合、独自のバリデーションルールを作成します。
公式のドキュメントにはAppServiceProviderに記載する例がありますが、今回はValidatorServiceProviderに定義します。
Validatorの拡張
app/Providers/ValidatorServiceProvider.php
class ValidatorServiceProvider extends ServiceProvider { public function boot() { $this->app->validator->resolver(function($translator, $data, $rules, $messages, $attributes) { return new CustomValidator($translator, $data, $rules, $messages, $attributes); }); // ↓これを追記 Validator::extend('rule', function($attribute, $value, $parameters, $validator) { return true; // falseだとValidation失敗 }); }
ruleに指定した文字列をvalidator定義で指定することで呼び出せるようになります。
Validator::extend('custom_rule', function($attribute, $value, $parameters, $validator) { });
↓
$this->validate($request, [ 'currentpassword' => 'required|custom_rule', ]);
$attributeにはformの属性名(上記の例だとcurrentpassword)、$valueにはユーザからの入力値がはいります。
また、以下のようにパラメータを指定すると$parameters配列で受け取ることができます。
$this->validate($request, [ 'currentpassword' => 'required|custom_rule:100,200', ]);
↓
Validator::extend('custom_rule', function($attribute, $value, $parameters, $validator) { dd($parameters); });
↓
array:2 [▼ 0 => "100" 1 => "200" ]
では、入力されたパスワードとDBのパスワードが一致するかチェックしてみます。
ValidatorServiceProvider.php
Validator::extend('exist_password', function($attribute, $value, $parameters, $validator) { return Hash::check($value, Auth::user()->password); });
Controller
$this->validate($request, [ 'currentpassword' => 'required|exist_password', ]);