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クラスを作成して、それを継承するようにすると楽。