【Laravel11】validation後に返るデータ

Laravel

Lravel11のValidatorでバリデーション後にどのようなデータが返るのかの確認です。

Laravel - The PHP Framework For Web Artisans
Laravel is a PHP web application framework with expressive, elegant syntax. We’ve already laid the foundation — freeing ...

一応、公式に記載されているのですが、

実際に動作検証して知っておくのは重要です。

検証に使うデータとルール

このようなデータとルールで検証します。

$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
  • email
  • 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のカラムは事前に定義されているものしか扱えないので

存在しないカラムを指定するとエラーとなり

バグの温床となってしまいます。

間違っても、バリデーション前の入力をそのまま使うことはしてはいけません。

コメント

タイトルとURLをコピーしました