PHP
CakePHP
Laravel

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


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も使えそうじゃない?

https://book.cakephp.org/3.0/ja/core-libraries/time.html


内部的には、この 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 運営