BackEnd

Laravelのバリデーションtips

投稿日:

はじめに

こんにちは。今回はLaravelでバリデーションを書く時の、ややレアケースな「○○したい場合どうすればいいんだろう?」を備忘録的にまとめて紹介します。
基本的なバリデーションルールの設定方法は公式ドキュメントが分かりやすく、かつ充実してますので、それを読めば充分かと思います。
環境はPHP7.3.3, Laravel5.8です。

配列のバリデーションでRule::uniqueを使う時のカラム名を指定したい

上記のようなhtmlの場合、 mail_address.* と書くことで、配列の要素それぞれにバリデーションを実施できますが、下記のようにRule::uniqueを使ってユニーク確認をする時、生成されるSQL文のWHERE句が WHERE mail_address.1 = '***@test.com' のようになってしまい、そのまま実行すれば当然Exceptionが発生します。

これを防いで WHERE users.mail_address = '***@test.com' のようなWHERE句を生成するには、Rule::unique()に第2引数としてカラム名を指定します。

配列バリデーションのエラーメッセージ制御

日本語のエラーメッセージが resources/lang/ja/validation.php に定義されている前提とします。
FormRequestのrules()を 'mail_address.*' => ['required', 'email', 'string'] としている場合、エラー時は以下のようなメッセージが出てしまいます。

  • mail_address.0は必須です。
  • mail_address.1には正しい形式のメールアドレスを指定してください。
  • mail_address.2には文字列を指定してください。

attributes でプレースホルダを定義することで属性名を日本語に置き換えることができますが、ここでもバリデーションルールと同様の書き方ができます。下記は1次元配列ですが、多次元配列でも置換可能です。

カスタムバリデーションで、他の属性名を参照したい

独自バリデーションの作り方はいくつかありますが、 ServiceProvider で登録する方法の場合です。
validate**** のようなメソッド名で独自のバリデーションを実装する際、このメソッド内で別の属性を参照したくなるケースもあるかと思います。2つの入力値の組み合わせで何か判定したいとか。

上記の validateHoge では $attribute で属性名、 $input で入力値を受け取れますが、例えば name の値が欲しくなったら、継承元のValidatorクラスの getValue() で取得できます(引数は属性名)。

番外:複数の1次元配列を結合して2次元配列にしたい

何それ?だと思いますので下記コードをご覧ください。日付の1次元配列と時間の1次元配列を結合して、日時がセットになってる2次元配列を生成しています。
標準関数のarray_map一発でできてびっくりしました。自力で実装するならforeachをネストしてゴリゴリ書くことになると思います。

結果、以下のようになります。結合する配列の長さが同じであることが前提にはなりますが、すごい。10年近くPHP書いてますがこんなの知らなかった…。
Laravelとは関係無いtipsですが、先日PHPの配列操作であれこれ調べてる時に見つけて、ちょっと衝撃だったので紹介しました。
このサンプルでは2つの配列ですが、3つ以上でも動作します。

さいごに

Laravel、かゆいところに手が届いて楽しいです。「○○したいな」と思って調べれば大抵書き方が用意されていますので、よくできてるな〜と感じること頻りです。

おすすめ書籍

PHPフレームワーク Laravel Webアプリケーション開発 バージョン5.5 LTS対応 PHPフレームワーク Laravel入門

blog-page_footer_336




blog-page_footer_336




-BackEnd
-,

執筆者:

免責事項

このブログは、記事上部に記載のある投稿日時点の一般的な情報を提供するものであり、投資等の勧誘・法的・税務上の助言を提供するものではありません。仮想通貨の投資・損益計算は複雑であり、個々の取引状況や法律の変更によって異なる可能性があります。ブログに記載された情報は参考程度のものであり、特定の状況に基づいた行動の決定には専門家の助言を求めることをお勧めします。当ブログの情報に基づいた行動に関連して生じた損失やリスクについて、筆者は責任を負いかねます。最新の法律や税務情報を確認し、必要に応じて専門家に相談することをお勧めします。


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

Stripe Connectを使って複合プランの継続課金を実装その2

1 はじめに2 追加プランの作成3 実装3.1 日割り金額の確認3.2 追加プランの契約4 さいごに5 おすすめ書籍 はじめに 前回の記事では、プラン(月額)とユーザ数分のID(従量課金)という2種類 ...

laravel logo

laravel-enumを使ってみたら快適だった

1 はじめに2 enumについて3 環境4 導入5 enumクラス5.1 生成5.2 enumクラス編集5.3 日本語化6 マイグレーション6.1 生成6.2 編集7 プロパティのキャスト8 さいごに ...

Go言語

Go言語の基礎〜Go 1.11 開発環境構築とパッケージバージョン管理〜

1 はじめに2 Go言語(Golang)とは2.1 シンプルな構文2.2 コンパイル言語2.3 並行処理2.4 その他の特徴3 Go開発環境の構築3.1 Goのインストール3.1.1 1. homeb ...

laravel logo

Laravelでの署名付きURL生成

1 はじめに2 今回のサンプル3 ビュー4 ルーティング5 コントローラー5.1 署名付きURLの生成5.2 期限ありの署名付きURLの生成5.3 署名のチェック6 おまけ6.1 署名の仕組7 さいご ...

laravel logo

Laravel Authのパスワードリセット機能をカスタマイズする

1 はじめに2 準備2.1 Auth2.2 mailhog3 ユーザー登録とログイン4 パスワードリセットのカスタマイズ4.1 ルーティング確認4.2 view編集4.3 認証処理の編集5 リセット画 ...

フォロー

blog-page_side_responsive

2019年4月
 123456
78910111213
14151617181920
21222324252627
282930  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。