Laravelで、メールアドレスの書式チェックのvalidateルールを作成したかったので、 手順をまとめてみました。

調べてみるとメールアドレスの書式チェックはかなり奥が深いみたいで、 今回はhtmlタグの<input type="email”>と同じルールとしました。 正規表現としては、「{^[a-zA-Z0-9.!#$%&'+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:.[a-zA-Z0-9-]+)$}」になります。

色々と甘い所があるかもしれませんが、今回はこちらで進めさせていただきます。

ファイル作成

サービスプロバイダーの追加

以下のコマンドを実行します。

$ php artisan make:provider ValidatorMailAddressServiceProvider
$ vi app/Providers/ValidatorMailAddressServiceProvider.php
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Validate\MailAddressValidate;

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

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

Validate ruleの実装

わたしの場合はValidateというディレクトリを作成し、 そこにvalidateに関するファイルを格納することにしました。

$ vi app/Validate/MailAddressValidate.php
<?php

namespace App\Validate;

use App;
use Config;
use Log;

class MailAddressValidate extends \Illuminate\Validation\Validator
{
    /**
     * メールアドレスのバリデート
     * @param string $value - 入力値
     * @return boolean バリデート結果 (true = 問題なし、 false = 問題あり)
     */
    public static function validateMailaddress($attribute, $value, $parameters) {
        if (!is_string($value)) {
            return false;
        }

        // メールアドレスの書式チェック。HTMLタグのinput type=emailの条件に合わせる。
        if (!preg_match("{^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$}", $value)) {
            return false;
        }
        return true;
    }
}

登録

composer.jsonの編集

composer.jsonを編集して、Validateを追加します。

         "psr-4": {
            "App\\": "app/",
            "Validate\\" : "app/Validate/"
         }

config/app.phpの編集

続いて、作成したサービスプロバイダを登録します。

    'providers' => [
        〜〜省略〜〜

        // validator
        App\Providers\ValidatorMailAddressServiceProvider::class
    ]

resources/lang/en/validation.php

エラーメッセージを登録します。

return [
    〜〜省略〜〜
    // original validate
    'mail_address'         => 'invalid_mail_address.',

    'custom' => [
    〜〜省略〜〜
];

ここまでで作成と登録関係は終了。

使い方

作成したSampleRequestでvalidateをする場合になります。 この様にruleを指定することで、入力値(mail_address)の諸式チェックができます。

SampleRequestの作成

php artisan make:request SampleRequest

SampleRequest.phpのルール設定例

     public function rules()
    {
        return ['mail_address' => 'mail_address']
    }

これで、メールアドレスの書式チェックのvalidatルールを追加ですることができました。