🤷‍♂️

【Laravel】「○○日時には、todayより後の日付を指定してください。」...だと?

2021/03/24に公開

概要

LaravelのフォームリクエストでPOSTした日付情報のバリデーションに
「今日より後の日付になっているかどうか」
のルールを設定したいので、Laravelに用意されているafterを使って

app/Http/Requests/Front/SampleRequest.php
'sample_date' => 'date|after:today'

こう書いたんですけど、バリデーションメッセージは下のように...

"todayより"...(ルー大柴かい🤷‍♂️)

というわけでtoday今日に変えます。

環境

$ composer -V
Composer version 2.0.8 2020-12-03 17:20:38

$ php artisan --version
Laravel Framework 8.21.0

afterのバリデーションメッセージ

resources/lang/ja/validation.php
'after'                => ':attributeには、:dateより後の日付を指定してください。'

:attributeはフォームリクエストのattributesメソッドで設定できているけど、:datetodayという文字列が入ってしまっている様子。。

「today」を「今日」に変える方法

僕が見つけたのはこの3つの方法です。

  1. フォームリクエストで定義
  2. 言語ファイルのcustomで定義
  3. 言語ファイルのvaluesで定義

1.フォームリクエストで定義

まずはバリデーションを定義しているフォームリクエストのmessagesメソッドにこのフォームリクエスト専用のバリデーションメッセージを設定する方法です。

フォームリクエストに定義
public function messages()
{
    return [
        'sample_date.after' => '○○日には、今日より後の日付を指定してください。',
    ];
}

2.言語ファイルのcustomで定義

次は言語ファイル(resources/lang/ja/validation.php)のcustomで共通して使えるバリデーションメッセージを設定する方法です。

言語ファイルのcustomで定義
'custom' => [
     'sample_date' => [
         'after' => '○○日には、今日より後の日付を指定してください。',
     ],
 ],

ちなみに言語ファイルはこちら

3.言語ファイルのvaluesで定義

3つ目は言語ファイル(resources/lang/ja/validation.php)のvalues:dateに当てはめる文字列を設定する方法です。

言語ファイルのvaluesで定義
'values' => [
     'sample_date' => [
         'today' => '今日'
     ],
 ],

変更後のバリデーションメッセージ

できました!!
脱ルー大柴!!

まとめ

個人的に3の「言語ファイルのvaluesで定義」はパッと見コードを見ても理解しにくいかなと思ったので、1か2が良いかなと思っています。

あとはそのプロジェクトの方針によってカスタムメッセージを

  • フォームリクエスト
  • 言語ファイル

のどちらに追加していくのかは決めれば良いのかなと思います。

参考

Discussion