LoginSignup
16
17

More than 5 years have passed since last update.

Laravel5でカスタムバリデーション

Last updated at Posted at 2015-05-05

Laravelでカスタムバリデーションを作るのはちょっとめんどい。
いくつかのやり方があるようですが、ここでは、Validatorを継承したクラスを作り、それをサービスプロパイダに登録するやりかたを検証してみます。

やりたいこ

・なんでもいいので、カスタムバリデーションを作る。

やりかた

・Illuminate\Validation\Validatorを継承したクラスでルールを定義
・サービスプロバイダを定義
・サービスプロバイダを登録
・カスタムバリデーションを使う

という流れ

Validatorを継承したクラスにルールを記述

場所はどこでもいいのだけどapp/Servicesに置いているサンプルがあったので、それをまねる。
クラスを定義しない方法もありますが、ここにどんどん増やしていけばいいので、クラスを1つ作っておく方が楽。

<?php namespace App\Services;


class CustomValidator extends \Illuminate\Validation\Validator
{
    public function validateFoo($attribute,$value,$parameters){
        return $value == "foo";
    }

    public function validateBoo($attribute,$value,$parameters){
        return $value == "boo";
    }

}

こんな感じ。実際は正規表現でパターンみたりする。
ここで重要なことは、validateFooやvalidateBooという名前は、使用時には、foo, booとなる。つまり、validateはプリフィックスとなる。また、ルールの頭は小文字となる。なお、validateMyRuleとした場合は、myRuleとなるようだ(なお、カスタムエラーメッセージの定義にはmy_ruleとなるような記述もあるが未確認)。

サービスプロバイダを定義

ServiceProviderのひな形は、artisan make:providerでつくる。

<?php namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Services\CustomValidator;

class ValidatorServiceProvider extends ServiceProvider {

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

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

}

サービスプロバイダの登録

config/app.phpにプロバイダを登録

        'App\Providers\ValidatorServiceProvider',

カスタムバリデーションを使う

登録が完了すれば、後は普通のルールと同じ。

        $input = \Input::all();

        $rules = [
            'name'=>'required',
            'email'=>'required',
            'password'=>'boo',
            'card'=>'foo',
        ];

        $messages = [
            'name.required'=>'name is must.',
            'email.required'=>'email is must.',
            'password.required'=>'password is must.',
            'password.boo'=>'password is boo.',
            'card.foo'=>'カードはfooと入れて下さい。',
        ];

        $validation = \Validator::make($input,$rules,$messages);

標準のメッセージはlang/en/validation.phpのcustomをいじればいいらしい(なくても動く)。attribute毎に定義しないといけないのかな?

    'custom' => [
        'card' => [
            'foo' => 'card is must from lang.',
        ],
    ],

メモ

おかしくなったら

php artisan cache:clear

を、実行してみる。SFTPで同期作業していた際に、何度かパーミッションのエラーが出た。その際にcache:clearで治った。

16
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
17