Laravelで入力時・ビジネスロジックのバリデーションを行う

2018年08月28日 00時08分

web アプリケーションを公開するにあたって、ユーザーからの入力は避けては通れない。

フクシルでは、掲示板機能と口コミ機能を実装するので、フォームから文字列の入力を受け付けている形である。

入力に不正な値がある場合、もしくは悪意ある攻撃を防ぐために入力バリデーションは欠かすことができない。もちろん、ロジック部分及び、出力時のバリデーションも必要になる。

入力時のバリエーション、特にフロントの部分では、Validatorjs を導入して、submit が機能しない形もとりますが、あくまでそれは補助として行う。

Laravel でロジック部分のバリデーションを行う場合、複数のやり方がある。

1.コントローラー内にべた書きする。

2.フォームリクエストバリデーションを設定する。

3.カスタムバリテーションとして設定する。

4.ミドルウェアとして設定する。

役割と注意点

1.コントローラ内にべた書きする

役割

・手軽に実装したい場合に

注意点

基本的にコントローラ内に書くのは、よくない。

拡張性も悪く、メソッドごとにバリデーションを設定するのは手間で保守性も悪い。

2.フォームリクエストバリデーションを設定する

Laravel5.5 より、フォームリクエストバリデーションを設定することができる。

Artisan コマンドでフォームリクエストバリデーションを生成することができる。

php artisan make:request HogeValidator

フォームリクエストバリデーションを通すことで、コントローラにはバリエーション後の値が渡されるようになる。

役割

・コントローラとバリデーションの切り分け

・コードの簡素化

・保守性の向上

注意点

・フォームごとにバリデーションを設定する必要がある。

・バリデーションを適応する範囲が広い場合は、後述のカスタムバリデーションもしくは、ミドルウェアへの設定を行う。

3.カスタムバリテーションとして設定する

独自のバリデーションルールを設定したい場合は、カスタムバリデーションを使用する。

こちらは、Artisan コマンドの Rule を生成することで、設定できる。

php artisan make:rule HogeRule

生成された Rule 内の passes 内には処理を、message 内には失敗時のメッセージを設定する。

役割

・独自のバリデーションについて保守性の向上と記述の簡素化

注意点

・もっと広い範囲でバリデーションを設定する場合には、ミドルウェアに書き込む。

4.ミドルウェアとして設定する

最後はミドルウェアとして設定する場合について。

ミドルウェアは、アプリケーションへ送信された HTTP リクエストをフィルタリングする役割がある。

そのため、共通したバリデーション、(アプリケーションに値を渡したくないもの)についてはミドルウェアに設定すると抜け、漏れがなく設定することができる。

ミドルウェアも Artisan コマンドから生成することができ、

php artisan make:middleware HogeHoge

で生成することができる。

役割

全てのリクエストに共通したバリデーションを行いたい場合に設定する。

注意点

この部分は共通のバリデーションを設定するだけで、細部に関してはフォームリクエストバリデーションで個別に設定していく必要がある。

まとめ:役割と意図を考えて適切なバリデーションを

バリデーションに関しては、網の目を考えるとイメージしやすい。

〇一番粗いながら、大きな網でざっくりとバリデーションを行い、各入力値に関してはフォームの意図をはっきりさせた後に細かいバリデーションを行う。

〇バリデーションのルールに関しては、保守や管理がしやすいようにカスタムバリデーションを使用すること。

〇コントローラに書くことはあまりせず、フォームバリデーションを行い、コントローラとバリデーションの分離を行うこと。