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',
]);





