LoginSignup
5
5

More than 5 years have passed since last update.

FuelPHPでdoctrine-extensionを使ってcreated_at/updated_atを更新する

Posted at

created_at/updated_atをinsertやupdateのタイミングで更新しようとすると、
Eventを実装しなければならず、ややめんどくさい。

doctrine-extensionを使えば解決しそうだが、いざ使おうと調べるとSymfonyでの話ばかりだった。
実際に試したほうが早いと思い、試してみた。

全然難しくもなんともなかった。

事前準備

例のごとく、以前の記事と同じ構成の環境を使うので、同じ様にセットアップしておく。

composerでインストールする

上記のpackagistの通り、"gedmo/doctrine-extensions": "2.3.*@dev"を追加する。

composer.json
{
    "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でインストールする事によりcomposerautoloaderに追加されるので、設定する必要はない。

EventManagerに登録する

これを読む限りEventManagerTimestampableListenerを登録すればやりたいことは出来そうなので登録してみる。

aspendigital/fuel-doctrine2のライブラリ内でEventManagerを生成、EntityManagerにセットされてしまうので、
以前SQLLoggerを仕込んだ時と同様init_callbackを使って登録する。

以前の記事:
http://qiita.com/gyhino@github/items/52d3c90e8f20c9908a34

app/config/db.php
<?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:以下を追記する。

app/config/doctrine/Campaign.orm.yml
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すればうまく更新される。

5
5
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
5
5