Lravel11のValidatorでバリデーション後にどのようなデータが返るのかの確認です。
![](https://laravel.com/img/og-image.jpg)
一応、公式に記載されているのですが、
実際に動作検証して知っておくのは重要です。
検証に使うデータとルール
このようなデータとルールで検証します。
$validator = Validator::make(
data: [
'name' => 'hoge',
'email' => 'hoge@example.com',
'country' => 'Japan',
'job' => 'Home Guard',
],
rules: [
'name' => 'required|string|min:3|max:20',
'email' => 'required|email:rfc',
'country' => 'string|max:255',
],
);
▼データ項目は4つ
- name
- country
- job
▼バリデーション項目は3つ(jobは含まれていない)
- name: 必須、文字列、最低3文字、最長20文字
- email: 必須、RFC形式チェック
- country: 任意、文字列、最長255文字
バリデーション後のデータ取得方法
バリデーション後のデータ取得方法はいくつかあります。
公式ドキュメントで言及されているのは次の7つです。
メソッド | 戻り値 |
validated() | array |
safe() | Illuminate\Support\ValidatedInput |
safe()->only() | array |
safe()->except() | array |
safe()->all() | array |
safe()->merge() | Illuminate\Support\ValidatedInput |
safe()->collect() | Illuminate\Support\Collection |
検証:validated()
▼実行コード:
var_dump($validator->validated());
▼出力:
array(3) {
'name' =>
string(4) "hoge"
'email' =>
string(16) "hoge@example.com"
'country' =>
string(5) "Japan"
}
戻り値は配列、項目は「name」「email」「country」の3つ。
ルールに含まれない項目「job」は含まれません。
検証:safe()
▼実行コード:
var_dump($validator->safe());
▼出力:
class Illuminate\Support\ValidatedInput#13 (1) {
protected $input =>
array(3) {
'name' =>
string(4) "hoge"
'email' =>
string(16) "hoge@example.com"
'country' =>
string(5) "Japan"
}
}
戻り値は「Illuminate\Support\ValidatedInput」
項目は「name」「email」「country」の3つ。
項目「job」は含まれていません。
検証:safe()->only()
▼実行コード:
var_dump($validator->safe()->only(['email']));
▼出力:
array(1) {
'email' =>
string(16) "hoge@example.com"
}
戻り値は配列、項目は「email」だけです。
検証:safe()->except()
▼実行コード:
var_dump($validator->safe()->except(['email']));
▼出力:
array(2) {
'name' =>
string(4) "hoge"
'country' =>
string(5) "Japan"
}
戻り値は配列、項目は「name」「country」の2つ、
引数で指定した「email」は含まれません。
バリデーションしていない「job」は含まれません。
検証:safe()->all()
▼実行コード:
var_dump($validator->safe()->all());
▼結果:
array(3) {
'name' =>
string(4) "hoge"
'email' =>
string(16) "hoge@example.com"
'country' =>
string(5) "Japan"
}
戻り値は配列、項目は「name」「email」「country」の3つ。
「job」は含まれません。
検証:safe()->merge()
▼実行コード:
var_dump(
$validator
->safe()
->merge(['words' => 'May the force be with you.'])
);
▼出力:
class Illuminate\Support\ValidatedInput#14 (1) {
protected $input =>
array(4) {
'name' =>
string(4) "hoge"
'email' =>
string(16) "hoge@example.com"
'country' =>
string(5) "Japan"
'words' =>
string(26) "May the force be with you."
}
}
戻り値は「Illuminate\Support\ValidatedInput」、
項目は「name」「email」「country」と、
引数に指定した「words」の4つ。
「job」は含まれません。
検証:safe()->collect()
▼実行コード:
var_dump($validator->safe()->collect());
▼出力:
class Illuminate\Support\Collection#13 (2) {
protected $items =>
array(3) {
'name' =>
string(4) "hoge"
'email' =>
string(16) "hoge@example.com"
'country' =>
string(5) "Japan"
}
protected $escapeWhenCastingToString =>
bool(false)
}
戻り値は「Illuminate\Support\Collection」、
項目は「name」「email」「country」の3つ。
「job」は含まれません。
まとめ
Validatorの各メソッドの戻り値は、メソッド毎に異なるので、
しっかり把握した上で使いましょう。
当然のことですが、バリデーション後の戻り値には、
バリデーションルールに記載していない項目は含まれません。
これが重要で、余分な入力データが除外されることで
品質が一つ担保されます。
オブジェクトのプロパティや設定項目の場合、
余分な項目を取り込んでも「使わない」という選択肢がありますが、
DBのカラムは事前に定義されているものしか扱えないので
存在しないカラムを指定するとエラーとなり
バグの温床となってしまいます。
間違っても、バリデーション前の入力をそのまま使うことはしてはいけません。
コメント