LoginSignup
8
6

More than 5 years have passed since last update.

LaravelでCarbonではなくChronosを使ってみる

Last updated at Posted at 2018-05-22

Carbonではなく、Chronosを使う個人的な理由

・イミュータブルなChronosがいい(建前)
・CakePHP3.5でChronosに慣れてしまったから

インストール

インストールはcomposerでできる
https://book.cakephp.org/3.0/ja/chronos.html

# chronosの安定板をインストールする
composer require cakephp/chronos "@stable"

Chronos使用方法

useすれば普通に使える

use Cake\Chronos\Chronos;

$now = Chronos::now();

なんか普通にCake\I18n\Timeも使えそうじゃない?

内部的には、この Time ユーティリティを動かすために、CakePHP は Chronos を利用しています。 Chronos と DateTime でできることはなんでも、 Time と Date ですることができます。

Cake\I18n\Timeを使えるならそっちの方がいいし、試してみる

composer install cakephp/i18n

怒られたけど、composer.jsonのrequireに追加しろって言われてる

Invalid argument cakephp/i18n. Use "composer require cakephp/i18n" instead to add packages to your composer.json.

追加してみる

composer.json抜粋
    "require": {
        "php": "^7.1.3",
        "cakephp/i18n": "@stable",

composer installしてみる
どうやら入ったぽい

$composer install
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Warning: The lock file is not up to date with the latest changes in composer.json. You may be getting outdated dependencies. Run update to update them.
Package operations: 4 installs, 0 updates, 0 removals
  - Installing cakephp/core (3.6.4): Loading from cache
  - Installing cakephp/utility (3.6.4): Loading from cache
  - Installing cakephp/chronos (1.1.4): Loading from cache
  - Installing cakephp/i18n (3.6.4): Loading from cache

下記で普通に使えました。

use Cake\I18n\Time;

$now = Time::now();

ImmutableなFrozenTimeも使える

$php artisan tinker
Psy Shell v0.9.4 (PHP 7.2.4 — cli) by Justin Hileman
>>> use Cake\I18n\FrozenTime;
>>> $time = FrozenTime::now();
=> Cake\I18n\FrozenTime @1528811961 {#2340
     date: 2018-06-12 13:59:21.186572 UTC (+00:00),
   }
>>> $pastTime = $time->modify('-2 days');
=> Cake\I18n\FrozenTime @1528639161 {#2342
     date: 2018-06-10 13:59:21.186572 UTC (+00:00),
   }
>>> $time
=> Cake\I18n\FrozenTime @1528811961 {#2340
     date: 2018-06-12 13:59:21.186572 UTC (+00:00),
   }
>>> 

find後のオブジェクトをCarbonからTimeオブジェクトに変換する

useしたら使えるのはいいけど、findしたあとにcreated_atとかupdated_atがCarbonオブジェクトのままなんですが?
と後から気がついた。
変換する場合はModelにミューテターを追加する

model.php
/**
* CarbonをTimeオブジェクトに変換
* @param Illuminate\Support\Carbon
* @return Cake\I18n\Time
*/
public function getCreatedAtAttribute($createdAt)
{
    return Time::parse($createdAt);
}

/**
* CarbonをTimeオブジェクトに変換
* @param Illuminate\Support\Carbon
* @return Cake\I18n\Time
*/
public function getUpdatedAtAttribute($updatedAt)
{
    return Time::parse($updatedAt);
}

いちいちModelを追加する度に上記を追加するのくそ面倒なので、
MyModelとかカスタマイズ用のModelクラスを作成して、それを継承するようにすると楽。

参考

Carbon と Chronos から見る OSS 運営

8
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6