You are here
Home > !Laravel > バリデーション(1)Validatorファサードのextend

バリデーション(1)Validatorファサードのextend

はじめまして。ブログ主筆khino氏と同じプロジェクトで仕事をしてます。
彼とは別テーマを平行して掲載しますので、これまで順番に読み進めていた方にはちょっと読みにくくなるかもしれませんが、ご容赦ください。

私の最初のテーマはカスタムバリデーションルールです。
このシリーズでは、Validatorファサードの基本的な使い方から始めて、より複雑なルールの定義の仕方や、laravel 5.2で追加された配列定義のカスタムバリデーションまで紹介する予定です。

まずは、Validatorファサードのextendを利用する方法から。

コントローラやモデルに依存しない一般的なルールの追加は、サービスプロバイダーの中で定義するのが一般です。

app/Providers/AppServiceProvider.php

<?php

namespace App\Providers;

use Validator;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
         Validator::extend('kana', function($attribute, $value, $parameters, $validator) {
            // 半角空白、全角空白、全角記号、全角かなを許可
            return preg_match("/^[ぁ-んー  !-@[-`{-~]+$/u", $value);
        });    
    }

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

例は全角ひらがなだけを許可するバリデーションですが、見たとおり正規表現による判定を行っています。
カスタムバリデーションを使いこなす前に、正規表現を使いこなさなければなりませんが、それはまた別に勉強してくださいね。

エラーメッセージはバリデーション言語ファイルに追加しておきましょう。追加するのは「Validation Language Lines」のグループの末尾です。

resouces/lang/ja/validation.php に追加

    'unique' => ':attribute に指定された値はすでに存在しています',
    'url'    => ':attribute のフォーマットが正しくありません',

    // カスタムバリデーション

    'kana'   => ':attribute は全角のひらがなで入力してください',

「Custom Validation Language Lines」のグループは、属性名とルールの組み合わせでメッセージを独自のものにすると言う意味での「カスタム」です。

    'custom' =>[
        'password'  => [
            'alpha_num' => 'パスワードは10文字以上40文字以下の英数字で入力してください',
            'between'   => 'パスワードは10文字以上40文字以下の英数字で入力してください',
        ],
    ],

また、言語ファイル末尾の「Custom Validation Attributes」に属性名の訳を追加しておきましょう。メッセージ内の「:attribute」の部分に用いられるようになります。

    'attributes' =>[
        'name'  => '名前',
        'email' => 'メールアドレス',
    ],

 

また、モデルやコントローラに依存して、そこでしか使用しないバリデーションなら、次のように フォームリクエスト で定義することも可能です。

しかし、この位置ではユニットテストが作りにくくなるので、次回で説明するようにカスタムバリデーションクラスを作成して、すべてのバリデーションを1つにまとめて管理するほうが良いように思います。

app/Http/Requests/MemberRequest.php

<?php

namespace App\Http\Requests;

use Validator;
use App\Http\Requests\Request;
use App\Member;

class MemberRequest extends Request
{
    public function authorize() {
        return true;
    }

    public function rules()
    {
        Validator::extend('kana', function($attribute, $value, $parameters, $validator) {
            // 半角空白、全角空白、全角記号、全角かなを許可
            return preg_match("/^[ぁ-んー  !-@[-`{-~]+$/u", $value);
        });

        $member = Member::find($this->member_id);

        switch($this->method())
        {
        case 'POST':
            return [
                'email' => 'required|email|unique:member,email',
                'password'  => 'required|min:6|max:20|confirmed',
                'name' => 'required',
                'kana'  => 'required|kana'
            ];

        case 'PUT':
        case 'PATCH':
            return [
                'email' => 'required|email|unique:member,email,'.$member->member_id.',member_id',
                'name' => 'required',
                'kana'  => 'required|kana'
            ];
        }
    }

    public function attributes()
    {
        return [
            'email'	=> 'メールアドレス',
            'password' => 'パスワード',
            'name' => '名前',
            'kana' => 'ふりがな'
        ];
    }

    public function messages()
    {
        return [
            'kana'	=> ':attribute は全角ひらがなで入力してください',
        ];
    }
}

Leave a Reply

Top