created_at
/updated_at
をinsertやupdateのタイミングで更新しようとすると、
Event
を実装しなければならず、ややめんどくさい。
doctrine-extension
を使えば解決しそうだが、いざ使おうと調べるとSymfony
での話ばかりだった。
実際に試したほうが早いと思い、試してみた。
全然難しくもなんともなかった。
事前準備
例のごとく、以前の記事と同じ構成の環境を使うので、同じ様にセットアップしておく。
- http://qiita.com/gyhino@github/items/188d207d26f608269b3a
- http://qiita.com/gyhino@github/items/ddf92157b81f31ce5af2
composerでインストールする
上記のpackagistの通り、"gedmo/doctrine-extensions": "2.3.*@dev"
を追加する。
{
"require": {
"aspendigital/fuel-doctrine2": "dev-master",
"gedmo/doctrine-extensions": "2.3.*@dev",
"symfony/yaml": "~2.1"
},
"config": {
"vendor-dir": "app/vendor"
},
"minimum-stability": "dev"
}
追加したら以下のコマンドでインストール(更新)する。
php composer.phar update
なおcomposer
でインストールする事によりcomposer
のautoloader
に追加されるので、設定する必要はない。
EventManagerに登録する
これを読む限りEventManager
にTimestampableListener
を登録すればやりたいことは出来そうなので登録してみる。
aspendigital/fuel-doctrine2
のライブラリ内でEventManager
を生成、EntityManager
にセットされてしまうので、
以前SQLLogger
を仕込んだ時と同様init_callback
を使って登録する。
以前の記事:
http://qiita.com/gyhino@github/items/52d3c90e8f20c9908a34
<?php
return array(
'doctrine2' => array(
'proxy_dir' => APPPATH.'classes'.DIRECTORY_SEPARATOR.'proxy',
'proxy_namespace' => 'Proxy',
'metadata_driver' => 'simplified_yaml',
'metadata_path' => array(
APPPATH.'config'.DIRECTORY_SEPARATOR.'doctrine' => 'Entity',
),
'init_callback' => function($manager, $connection) {
$manager->getConnection()->getConfiguration()->setSQLLogger(new Sample\Doctrine\SQLLogger($connection));
$manager->getEventManager()->addEventSubscriber(new \Gedmo\Timestampable\TimestampableListener());
},
),
);
これでフレームワーク側の設定完了。あっさり。
エンティティの定義
あとはエンティティの定義を追加すれば、動く。
色々あってyamlでの定義に変更したので、今回はyamlでの定義を記載する。
対象フィールドにgedmo:
以下を追記する。
Entity\Campaign:
table: campaigns
repositoryClass: Entity\CampaignRepository
id:
id:
type: integer
generator:
strategy: AUTO
fields:
title:
type: string
length: 512
createdAt:
column: created_at
type: datetime
gedmo:
timestampable:
on: create
updatedAt:
column: updated_at
type: datetime
gedmo:
timestampable:
on: update
あとは通常通りpersistすればうまく更新される。