Laravelのバリデーションを解説するにあたり、大きく分けると以下の2つに分けられます。
- バリデーション方法
- Illuminate\Http\Requestクラスのvalidateメソッド
- Validatorファサード
- FormRequest
- バリデーションルール指定方法
- あるフォーム項目が入力されているか
- あるフォーム項目が任意の形式に沿っているか
- 等など……
1についてはどうやってバリデーションするか(こちらで解説しています)。そして本ページで解説する2は、どうやって個別の項目にルールを設定するかとなります。
バリデーションの要となる要素ですので、Laravelを利用するならしっかりと学んでおきましょう。
バリデーション方法とバリデーションルール、ごっちゃにしてるとこんがらがるので、切り分けて一つずつ学んでください。
バリデーション実例
バリデーションの方法は複数ありますが、その際のルールの指定方法は共通しています。それは、ルールは「配列」で指定するということです。
論より証拠。まずはバリデーション情報が異なる実例をご覧いただき、感覚を掴んでみてください。これから挙げる3例は、全て以下の形式でバリデーションしています。
- name: 文字列で最大32文字
- email: メールアドレスの形式で
名前とメールアドレスが、送信フォームからPOST(送信)されてきたと想像してご覧ください。
1.FormRequestクラスでのバリデーション例
実践では最も多く利用される、FormRequest
クラスでのバリデーション例です。
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class ProfileUpdateRequest extends FormRequest
{
public function rules(): array
{
// バリデーションルールを定義
return [
'name' => ['string', 'max:32'],
'email' => ['email'],
];
}
}
12~15行目で、配列としてバリデーションルールを定義しています(すぐreturn
で返しています)。
2.Validaterファサードの例
Validater
ファサードを使った同じバリデーションルール指定です。
public function store(Request $request): RedirectResponse
{
// バリデーション実行
$validator = Validator::make($request->all(), [
'name' => ['string', 'max:32'],
'email' => ['email'],
]);
// 以下省略
4~7行目で、先ほどと同じく配列で指定していますね。
3.Illuminate\Http\Requestのvalidateメソッドの例
public function store(Request $request): RedirectResponse
{
// バリデーション実行
$validated = $request->validate([
'name' => ['string', 'max:32'],
'email' => ['email'],
]);
// 以下省略
4~7行目で配列として指定しています。Validater
ファサードとほぼ同じですね。
指定の基本フォーマット
実際のコードで何となく分かったところで、ここから指定の基本を詳しく見ていきます。
フォーマット
ルールを指定する配列は、以下の様なフォーマットで指定します。
[
'フォーム項目名1' => ['ルール1', 'ルール2'],
'フォーム項目名2' => ['ルール1'],
]
配列の中に、フォーム項目ごとに配列として定義する形になりますね。
いくらでも増やせる
フォーム項目名やルールは、必要に応じていくらでも増やせます。
[
'フォーム項目名1' => ['ルール1', 'ルール2', 'ルール3', 'ルール4'],
'フォーム項目名2' => ['ルール1'],
'フォーム項目名3' => ['ルール1', 'ルール2'],
]
ルールはパイプで指定も可
配列の中に配列ではなく、配列の中に|
(パイプ)でつないだ文字列での指定も可能です。先ほどの例をパイプ記法で書き直したのが以下です。
[
'フォーム項目名1' => 'ルール1|ルール2|ルール3|ルール4',
'フォーム項目名2' => 'ルール1',
'フォーム項目名3' => 'ルール1|ルール2',
]
配列記法は、ルールが多い場合やルール名が長い場合に見やすいです。対してパイプ記法はより短く、一行での表現が可能な場合に見やすいです。これらは逆もまたしかりですね。
どちらを選べば良いかですが、いずれもOKです。コードの可読性や、実務ではプロジェクトのコード規約に準ずるのが良いでしょう。
フォーム項目名の指定例
より実践的・具体的な例を見ていきましょう。まずはフォーム項目名からです。
一般的な例
フォーム項目名はウェブアプリケーションにより、当然異なります。
例えばフロントであるHTMLにて、以下のようなタグでフォーム項目があったとします。
お名前: <input name="your_name" value="">
<br>
Email: <input name="your_email" value="">
上記の場合、Laravelのバリデーションルールでは、以下の様な指定になります(ルールについてはここでは置いておきます)。
[
'your_name' => ['ルール1', 'ルール2'],
'your_email' => ['ルール1'],
]
'yourName'
にはルール1とルール2。'yourEmail'
にはルール1が適用される指定です。
ネストされる例
時おり、以下の様にネストされたフォーム項目名を使用することもあります。
著者名: <input name="author[name]" value="">
<br>
著者説明: <input name="author[description]" value="">
こういった場合は、ドットで連結して指定します。
[
'author.name' => ['ルール1', 'ルール2'],
'author.description' => ['ルール1'],
]
ドットが含まれる例
あまりないと思いますが、フォーム項目に.
(ドットまたはピリオド)が含まれる場合もあるかもしれません。
著者名: <input name="author.name" value="">
<br>
著者説明: <input name="author.description" value="">
こういった場合は、\
(バックスラッシュ:Windowsの場合半角の¥)でエスケープすることで使えます。
[
'author\.name' => ['ルール1', 'ルール2'],
'author\.description' => ['ルール1'],
]
ただ、誤解を招きやすいのでそもそもこういった命名を避けた方がよいかもしれません。シンプルであるのが分かりやすく、良いコードと言えます。
ルールの指定例
つぎにルールの具体的な指定方法について解説します。ルールはLaravelが定義していますので、私たちエンジニアはそれを指定していくことになります。
基本例
とてもシンプルな例からご紹介しましょう。
[
'your_name' => ['string'],
'your_email' => ['email'],
]
この例の2行目の'your_name'
は'string'
、つまり文字列であることを指定しています。
3行目は'email'
、メールアドレスの形式であることを指定しています。
'string'
も'email'
も、英語的な意味合いから直感的にわかりやすいですね。このような感じで、Laravelではバリデーションルールを簡単に指定できるようになっています。
複数のルール
すでに説明しているとおり、複数のルールを適用することが可能です。
[
'your_name' => ['required', 'string'],
'your_email' => ['required', 'email'],
]
この例では、供に'required'
という、入力が必須であるルールを追加しています。このように、複数ルールを絡めることで独自のバリデーションを作り上げていくことが可能です。
パラメータ
ルールにはパラメータ(公式ではオプションという表記も)を付けられるものもあります。
[
'your_name' => ['required', 'string', 'max:32'],
'your_email' => ['required, 'email'],
]
2行目のmax:32
がそれです。パラメータは:
(コロン)で区切って設定します。
max
が最大値を意味するルール。そして:
の後にある32
というパラメータが、文字数は32文字までという意味です。
なのでこの例では、'your_name'
が最大32文字までとなります。32
の部分を64
とすれば、64文字にルールを変えることも簡単です。
全てのルールにパラメータがあるわけではありませんが、このmax
のように、パラメータを使うことを前提として使用するルールもあります。
複数のパラメータ
先ほどのmax
はパラメータが1つだけでした。ルールの中には複数のパラメータを与えられるものもあります。
[
'number_field' => 'integer|between:1,10',
]
between
の後に、:
で挟んだ1,10
がパラメーターです。複数のパラメータは ,
(カンマ)で区切ります。
ですのでここでは1
と10
の2つがパラメータとなります。
between:1,10
とすることで、1~10の間というルール指定となります。
よく使うルール一覧
もうここまでくれば、Laravelの公式マニュアルからルールを辞書的に引くだけでバリデーションができるようになっているはずです。
ここでは初心者の方向けに、よく使うルールを上げておきます。シンプルなウェブアプリケーションでは、これらのコピペ&微修正で事が足りてしまうことも多いです。
文字入力用
これまで何度も登場しました。しかしながら、実務でもこれは頻出する書き方です。required
を無くしたり、max:32
のパラメータを変えれば、大抵の文字入力に応用できます。
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class ProfileUpdateRequest extends FormRequest
{
public function rules(): array
{
return [
'your_name' => ['required', 'string', 'max:32'],
];
}
}
以後、共通部分のコードは省略します。
数字入力用
フォームでは単純な数字の入力が必要なケースも多いです。この例では10文字以内の文字列となります。
// 省略
public function rules(): array
{
return [
'your_name' => ['required', 'integer', 'max:10'],
];
}
// 省略
○文字以上というルールも加えたい場合は、先ほど出てきたbetween:1,10
などを使っても良いですね。
URLの入力
普通なら正規表現で行うことも多い、URLのバリデーションもLaravelでは簡単です。
// 省略
public function rules(): array
{
return [
'your_url' => ['nullable', 'url'],
];
}
// 省略
ここでは'required'
ではなく、'nullable'
を指定しました。'nullable'
は'require'
とは異なり、null
や''
(空文字)でも許容する設定です。
URLは任意項目……という実装も多いのでこのようにしてみました。
ちなみに、'required'
を外すだけでは任意項目にはなりません。空文字はURLの形式ではないのでバリデーションが通らないからです。
この例のように、明示的に'nullable'
が必要な場合があることは覚えておきたいところです。
メールアドレス入力用
メールアドレスの例はこれまでもご紹介していますので、ちょっとひねりを加えてみました。ここでは度々実務でも使われる「メールアドレス再入力」欄もルールに組み込んでいます。
// 省略
public function rules(): array
{
return [
'your_email' => ['required', 'email'],
'email_confirmation' => ['required', 'email', 'same:your_email'],
];
}
// 省略
'email_confirmation'
の'same:your_email'
で、'your_email'
と同じ値が必要であるというルールを設定しています。
その他
条件によってルールを変えたいということは往々にしてあります。また、独自バリデーションを行いたい場合もあります。
複雑なバリデーションルールは、改めて別ページでご紹介します。
まとめ
以上、Laravelのバリデーションルールの設定方法について、初心者向けに解説しました。進行もゆっくり&丁寧に書いたため、やや冗長に感じられたかもしれません。
しかし、バリデーションはウェブアプリケーションのセキュリティを守る重要な要素です。実務を行う際には、しっかりとした理解が必要とされますので、少しでも理解を深める手助けとなれば幸いです。
なお、実際にLaravelでバリデーションをする場合は、エラーメッセージの調整など他にも気をつかう必要があります。それらについてもまた別の機会でご紹介したいと思います。
コメント