laravel バリデーションルールを自分で作る（カスタムバリデーター）

## 目的

- バリデーションルールを自分で作成するカスタムバリデーターについてまとめる

## 環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Big Sur(11.6) |
| ハードウェア | MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) |
| プロセッサ | 2 GHz クアッドコアIntel Core i5 |
| メモリ | 32 GB 3733 MHz LPDDR4 |
| グラフィックス | Intel Iris Plus Graphics 1536 MB |

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| PHP バージョン | 7.4.11 | Homebrewを用いてこちらの方法で導入→[Mac HomebrewでPHPをインストールする](https://qiita.com/miriwo/items/cd54077aad7e139cf518) |
| Laravel バージョン | 8.X | commposerを用いてこちらの方法で導入→[Mac Laravelの環境構築を行う](https://qiita.com/miriwo/items/adaaaeecae69d6392e08) |
| MySQLバージョン | 8.0.21 for osx10.13 on x86_64 | Homwbrewを用いてこちらの方法で導入→[Mac HomebrewでMySQLをインストールする](https://qiita.com/miriwo/items/ef6a064bc545fbea29d9) |

## 概要

- 下記記事で取り扱ったlaravelアプリにカスタムバリデーターを作って設定してみる。
- 今回はpostされた`content`の値が数字以外だったら弾く独自バリデーションルールを作ってみる。
- 作業完了後のコードは下記にpushしてある。
    - [https://github.com/miriwo0104/laravel8_easy_crud/tree/custom_validate](https://github.com/miriwo0104/laravel8_easy_crud/tree/custom_validate)

## 方法

1. `laravel8_easy_crud/app`ディレクトリ直下に「Validator」ディレクトリを作成する。
1. `laravel8_easy_crud/app/Validator`直下に`CustomValidator.php`を作成して下記のように記載する。

    ```laravel8_easy_crud/app/Validator/CustomValidator.php
    <?php
    
    namespace App\Validator;
    
    use Illuminate\Validation\Validator;
    
    class CustomValidator extends Validator
    {
        public function validateNumOnly($attribute, $value)
        {
            return (preg_match("/^[0-9 ]+$/i", $value));
        }
    }
    ```

1. `AppServiceProvider.php`を開き下記のように記載する。

    ```laravel8_easy_crud/app/Providers/AppServiceProvider.php
    <?php
    
    namespace App\Providers;
    
    use Illuminate\Support\ServiceProvider;
    use App\Validator\CustomValidator;
    
    class AppServiceProvider extends ServiceProvider
    {
        /**
         * Register any application services.
         *
         * @return void
         */
        public function register()
        {
            $this->app->bind(
                \App\Repositories\ContentRepositoryInterface::class,
                \App\Repositories\ContentRepository::class
            );
        }
    
        /**
         * Bootstrap any application services.
         *
         * @return void
         */
        public function boot()
        {
            \Validator::resolver(function($translator, $data, $rules, $messages) {
                return new CustomValidator($translator, $data, $rules, $messages);
            });
        }
    }
    ```

1. 当該のフォームリクエストクラスを下記のように修正して作成したバリデーションルール名を記載する。自分で作成したバリデーションルールを使いたい場合は`CustomValidator`クラスで定義したメソッドの`validate`より後ろ部分をスネークケースに変換して記載する。

    ```laravel8_easy_crud/app/Http/Requests/ContentRequest.php
    <?php
    
    namespace App\Http\Requests;
    
    use Illuminate\Foundation\Http\FormRequest;
    
    class ContentRequest extends FormRequest
    {
        /**
         * Determine if the user is authorized to make this request.
         *
         * @return bool
         */
        public function authorize()
        {
            return true;
        }
    
        /**
         * Get the validation rules that apply to the request.
         *
         * @return array
         */
        public function rules()
        {
            return [
                'content' => ['required', 'num-only'],
            ];
        }
    }
    ```

1. 確認
    1. laravelのローカルサーバーを起動してURL[/contents/create](http://127.0.0.1:8000/contents/create)にアクセスし数値以外の数字を入力して「投稿」をクリックする。

        ![新規投稿.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/23e9ca21-2295-3583-fe79-a4027f80cb1d.png)

    1. 下記のように入力テキストボックスの上にカスタムバリデーターのデフォルトのエラーメッセージが表示されれば自分で作成したカスタムバリデーターが正しく機能している。

        ![新規投稿.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/31dd7279-6b02-6b75-328b-6a76ae808c84.png)


   
## 参考文献

- [https://techblog.styleedge.co.jp/entry/2019/10/09/163338](https://techblog.styleedge.co.jp/entry/2019/10/09/163338)
- [https://www.larajapan.com/2016/08/14/%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%90%E3%83%AA%E3%83%87%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3-2-customvalidator%E3%82%92%E8%BF%BD%E5%8A%A0/](https://www.larajapan.com/2016/08/14/%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%90%E3%83%AA%E3%83%87%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3-2-customvalidator%E3%82%92%E8%BF%BD%E5%8A%A0/)