Laravelで独自バリデーションを実装する方法

アイキャッチ画像

Laravelには多彩なバリデーションが用意されています。大抵の場合はそれらを活用することでバリデーションを設定できますが、日本語独自のバリデーションなど、デフォルトの機能では実現できないものもあります。

そのような場合どうやって実装していくのかを紹介します。

独自のバリデーションの作成

まずは独自バリデーションを定義します。

app/Validator.php

として配置します。

Laravel上のVlidatorを継承して独自バリデーションClassを作成しています。

ただこのままでは独自バリデーションはフレームワーク上で認識されないので、サービスプロバイダを定義します。

さらにconfig/app.phpのプロバイダに先ほどのバリデーションのサービスプロバイダを追記します。

独自バリデーションの例

ひらがな、カタカナのチェック

仮名入力などのチェックでひらがな、カタカナのチェックが必要ですが、Laravelの既存のバリデーションではチェックできません。そのため、次のような正規表現で実装します。

フォームリクエストでは次のようにバリデーションを設定できるようになります。

必須チェックの強化

Laravelのバリデーションで必須の場合はrequiredとして定義します。ただ、これだけでは完全ではない場合があります。

formの値として空文字が送信された場合はエラーになりますが、そもそもform項目として存在しない場合バリデーションが実行されません。

氏名、フリガナといった項目はかならずform上で存在しますが、選択肢として複数項目を配列として指定するような画面の場合、追加ボタンを押下しないとform項目が出現しません。またアップロードする画像を指定しないとform項目が作成されないといったパターンがあります。

そういった何も送信されない場合でも必須チェックをかける場合は以下のようなバリデーションを作成します。

内部的にはLarvel自体のrequired、required_ifと同じ処理です。このままでは結局フォーム値として送信しないとバリデーションが実行されません。そのために暗黙の拡張に追加する必要があります。

こうすることでimplicit(暗黙)の必須チェックを実装できます。

あとはフォームリクエストのrequiredを下記のように置き換えるだけです。

バリデーションエラーメッセージの調整

エラーメッセージを定義しないとLaravelデフォルトの英文エラーメッセージになってしまうので、言語設定ファイルで独自バリデーションのエラーメッセージを追加する必要があります。

まとめ

単純な文字種チェックだけではなく、より複雑なものも独自バリデーションで実装可能になります。
例えばヘアサロンの予約で、「あなたはすでに同じ時間帯で予約済みです。」といった入力チェックも可能になります。
amazonでも同様のバリデーションがあれば嬉しいのですが、残念ながら実装されていません。同じコミックを間違って2冊買って、ダブったものをBookoffに売りに行くことが何度かありました…
こういったことが起きないようにユーザに優しい細やかなバリデーションを実装していきましょう。