データベースから値を取ってきて、そのままviewへ入れた時、datetime型などの表示を整形(YYYY年MM月DD日みたいな感じ)して表示したい時がしばしばあります。
そんな時にうまい方法がないかと考えて、思いついたのでメモしときます。
コントローラで取得した値をviewに放り込む
ちょっと乱暴ですが概ねこんな感じでviewに入れますよね。
AnythingController.php
$this->view->items = Item::find();
イマイチコード
毎回以下のようにやってました。
しかし、面倒だし見た目が良くないので何とかしたいと思いました。
イマイチその1@model内
// 不要な時もやってしまうし、余計な値を毎回入れたくない
public function afterFetch()
{
$this->updated_at_timestamp = strtotime($this->updated_at);
}
イマイチその2@volt内
// 表示するだけに2行必要だし、volt内にPHPコード入れるのはどうかと
<?php $time = strtotime($data->updated_at); ?>
{{ date('Y年m月d日', time) }}
イマイチその3@volt内
// volt内にPHPコード入れるのはどうかと
<?php echo date('Y年m月d日', strtotime($data->updated_at); ?>
結論
色々考えた挙句、単純にフィルタにstrtotimeを追加してみました。
services.php抜粋
$volt = new VoltEngine($view, $di);
// strtotimeフィルタ追加
$volt->getCompiler()->addFilter('strtotime', 'strtotime');
anything.volt
{{ date('Y年m月d日', data.updated_at | strtotime) }}
期待通りでスッキリしました。
以上です。