ハマログ

株式会社イーツー・インフォの社員ブログ

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

20160605 143143

LaravelLaravel5laravel5.2PHPValidationエラー

  kaneko tomo   2016年6月5日


関連記事

Laravel EloquentのソートでNULLを最後に持ってくる(MySQL)

Laravel5系+MySQL5のはなし。 Laravel+Eloquentのプ…

composer updateでthe requested PHP extension dom is missing from your system.

新しい環境で、composer update(install) を実行したところ…

Laravel4でForm::checkboxのチェック状態判定

laravel4にてForm::checkboxのチェック状態判定を行いました。…


← 前の投稿

次の投稿 →