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入門

page_footer_300rect




page_footer_300rect




-BackEnd
-,

執筆者:


comment

メールアドレスが公開されることはありません。

CAPTCHA


関連記事

laravel logo

Laravelのバッチ処理を作る

1 はじめに2 環境3 artisanコマンド作成4 artisanコマンドをバッチとして登録する5 さいごに6 おすすめ書籍 はじめに こんにちは。webアプリにつきもののバッチ処理ですが、もちろん ...

laravel logo

[Laravel] ログの扱い方 [5.8]

1 はじめに2 環境3 Monologについて4 コード上で設定する方法5 config/logging.phpで設定する方法6 おまけ:ログレベルについて7 さいごに8 おすすめ書籍 はじめに こん ...

rails

Shrineでアップロードする際に画像を加工する

1 はじめに2 アップロードする画像のリサイズ2.1 Gemを追加2.2 Uploaderの修正3 サムネイルを作成する3.1 Uploaderの修正3.2 サムネイルを表示する4 バリデーションの追 ...

Docker上のLaravelのログをFluentdに出力する

1 はじめに2 環境3 Fluentdについて4 目的5 Fluentd本体はdocker-composeで導入5.1 fluentd5.2 db5.3 app5.4 web6 Laravelからログ ...

icon

PHP、Ruby、Pythonのfor構文を比較してみた

1 はじめに1.1 環境2 ドキュメント2.1 PHP2.2 Ruby2.3 Python3 1から100まで出力してみる3.1 PHP3.2 Ruby3.3 Python4 リスト型(配列)の出力4 ...

フォロー

follow us in feedly

page_side_300rect

2019年4月
« 3月 5月 »
 123456
78910111213
14151617181920
21222324252627
282930 

アプリ情報

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