Laravel 8.77.0から$request変数から日付型のものはCarbonオブジェクトでも取得できるようになりました。
今回はその機能を実際に使ってみたいと思います。
今回、使用する共通のリクエストパラメータ
今回は以下のようなリクエストを投げて確認します。
$this->post('/date', [ 'datetime' => '2022-01-12 01:23:45', 'date' => '2022-01-12', 'time' => '01:23:45', 'format' => '1577895825', ]);
また、Controllerは以下のようなものを作りました。
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class DateController extends Controller { public function __invoke(Request $request) { // ここでリクエスト内容を確認する dump($request->input('datetime')); } }
実際に取得する
では、早速取得していきましょう。
通常のCarbonオブジェクトとして取得する
Controllerの中身で以下のようにdump()してみました。
dump($request->input('datetime')); dump($request->date('datetime'));
出力結果は以下になりました。
"2022-01-12 01:23:45" Illuminate\Support\Carbon @1641950625^ {#664 #endOfTime: false #startOfTime: false #constructedObjectId: "00000000000002980000000000000000" #localMonthsOverflow: null #localYearsOverflow: null #localStrictModeEnabled: null #localHumanDiffOptions: null #localToStringFormat: null #localSerializer: null #localMacros: null #localGenericMacros: null #localFormatFunction: null #localTranslator: null #dumpProperties: array:3 [ 0 => "date" 1 => "timezone_type" 2 => "timezone" ] #dumpLocale: null #dumpDateProperties: null date: 2022-01-12 01:23:45.0 UTC (+00:00) }
リクエストパラメータ2022-01-12 01:23:45
に対して、UTCのタイムゾーンとして取得しCarbonオブジェクトを作ってくれていますね。
もちろん、config/app.php
のtimezone
をAsia/Tokyo
などに設定すれば、そのタイムゾーンで作成してくれます。
"2022-01-12 01:23:45" Illuminate\Support\Carbon @1641918225^ {#664 #endOfTime: false #startOfTime: false #constructedObjectId: "00000000000002980000000000000000" #localMonthsOverflow: null #localYearsOverflow: null #localStrictModeEnabled: null #localHumanDiffOptions: null #localToStringFormat: null #localSerializer: null #localMacros: null #localGenericMacros: null #localFormatFunction: null #localTranslator: null #dumpProperties: array:3 [ 0 => "date" 1 => "timezone_type" 2 => "timezone" ] #dumpLocale: null #dumpDateProperties: null date: 2022-01-12 01:23:45.0 Asia/Tokyo (+09:00) }
フォーマットを指定して取得(リクエストパラメータにタイムスタンプで送られてきた場合)
次にフォーマットを指定して取得してみます。わかりやすいフォーマットでタイムスタンプを使用してみます。
dump($request->input('format')); dump($request->date('format', 'U'));
このように、第2引数にフォーマットを指定します。
出力結果は以下になります。
"1577895825" Illuminate\Support\Carbon @1577895825^ {#675 #endOfTime: false #startOfTime: false #constructedObjectId: "00000000000002a30000000000000000" #localMonthsOverflow: null #localYearsOverflow: null #localStrictModeEnabled: null #localHumanDiffOptions: null #localToStringFormat: null #localSerializer: null #localMacros: null #localGenericMacros: null #localFormatFunction: null #localTranslator: null #dumpProperties: array:3 [ 0 => "date" 1 => "timezone_type" 2 => "timezone" ] #dumpLocale: null #dumpDateProperties: null date: 2020-01-01 16:23:45.0 +00:00 }
このように、リクエストパラメータでタイムスタンプとして送られてきても、$request->date('format', 'U')
とすれば簡単にCarbonに変えられることを確認できました。
タイムゾーンを指定して取得
次に、タイムゾーンを指定して取得してみます。これはconfig/app.phpで指定したtimezoneとは異なる場合に利用できるかなと思います。
dump($request->input('datetime')); dump($request->date('datetime', null, 'Asia/Tokyo'));
これの出力結果は以下になります。
"2022-01-12 01:23:45" Illuminate\Support\Carbon @1641918225^ {#685 #endOfTime: false #startOfTime: false #constructedObjectId: "00000000000002ad0000000000000000" #localMonthsOverflow: null #localYearsOverflow: null #localStrictModeEnabled: null #localHumanDiffOptions: null #localToStringFormat: null #localSerializer: null #localMacros: null #localGenericMacros: null #localFormatFunction: null #localTranslator: null #dumpProperties: array:3 [ 0 => "date" 1 => "timezone_type" 2 => "timezone" ] #dumpLocale: null #dumpDateProperties: null date: 2022-01-12 01:23:45.0 Asia/Tokyo (+09:00) }
このように、2022-01-12 01:23:45
をAsia/Tokyo
のタイムゾーンとして取得してCarbonオブジェクトを作成してくれました。
例えば、このAPIだけ外部サービスを利用しているためAsia/Tokyo
じゃなくてUTC
でリクエストが送られてくる、みたいな例で活用できそうです。
リクエストパラメータの日付型(2022-01-12)を取得する
次は、日付で送られてきたパラメータをCarbonに変換したいと思います。
dump($request->input('date')); dump($request->date('date'));
特に何も考えずに同じ書き方で大丈夫です。これはCarbonのすごいところですよね。
これの出力結果は以下になります。
"2022-01-12" Illuminate\Support\Carbon @1641945600^ {#680 #endOfTime: false #startOfTime: false #constructedObjectId: "00000000000002a80000000000000000" #localMonthsOverflow: null #localYearsOverflow: null #localStrictModeEnabled: null #localHumanDiffOptions: null #localToStringFormat: null #localSerializer: null #localMacros: null #localGenericMacros: null #localFormatFunction: null #localTranslator: null #dumpProperties: array:3 [ 0 => "date" 1 => "timezone_type" 2 => "timezone" ] #dumpLocale: null #dumpDateProperties: null date: 2022-01-12 00:00:00.0 UTC (+00:00) }
ちゃんと時間が0時0分0秒になっていますね。
リクエストパラメータの時間型(01:23:45)を取得する
日付をやったということは、時間もやるということですね。01:23:45
もCarbonにしてみたいと思います。
dump($request->input('time')); dump($request->date('time'));
これの出力結果は以下になります。
"01:23:45" Illuminate\Support\Carbon @1641950625^ {#689 #endOfTime: false #startOfTime: false #constructedObjectId: "00000000000002b10000000000000000" #localMonthsOverflow: null #localYearsOverflow: null #localStrictModeEnabled: null #localHumanDiffOptions: null #localToStringFormat: null #localSerializer: null #localMacros: null #localGenericMacros: null #localFormatFunction: null #localTranslator: null #dumpProperties: array:3 [ 0 => "date" 1 => "timezone_type" 2 => "timezone" ] #dumpLocale: null #dumpDateProperties: null date: 2022-01-12 01:23:45.0 UTC (+00:00) }
しっかり今日の日付で01:23:45の時間のCarbonオブジェクトが取得できました。
最後に
今まではリクエストパラメータをinput()で取得しつつ、それをCarbonに変換する処理を毎回書いていたかと思います。
$date = Date::parse($request->input($key));
今回のアップデートを利用することで簡単にCarbonで取得できるようになりました。
$date = $request->date($key);
だいぶ書きやすくなったのではないでしょうか。