ポンコツエンジニアのごじゃっぺ開発日記。

いろいろポンコツだけど、気にするな。エンジニアの日々の開発などの記録を残していきます。 自動で収入を得られるサービスやシステムを作ることが目標!!

【Laravel 8.x】Request $requestからCarbonオブジェクトを一発で取得する。

Laravel 8.77.0から$request変数から日付型のものはCarbonオブジェクトでも取得できるようになりました。

github.com

今回はその機能を実際に使ってみたいと思います。

今回、使用する共通のリクエストパラメータ

今回は以下のようなリクエストを投げて確認します。

$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.phptimezoneAsia/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:45Asia/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);

だいぶ書きやすくなったのではないでしょうか。

お問い合わせプライバシーポリシー制作物