Symfony2 Doctrine Timestampable を使用する

2012年6月15日

symfony-logo

効率的なWebアプリケーションの作り方 ~PHPによるモダン開発入門を写経していたところ、Timestampable の導入のところでハマったので導入方法と使用方法をメモします。

StofDoctrineExtensionsBundle のマニュアルにも、書籍にも、git submodule を使用したインストール方法が書かれていますが、この方法ではうまく導入できませんでした。この記事では、deps ファイルを編集してインストールする方法を紹介します。

動作確認環境

  • Symfony 2.0.15

目次

  1. Symfony/depsファイルの編集
  2. インストール
  3. Symfony/app/autoload.phpの編集
  4. Symfony/app/AppKernel.phpの編集
  5. Symfony/app/config.ymlファイルの編集
  6. Entityの編集
  7. 動作確認
  8. 参考サイト

Symfony/depsファイルの編集

Symfony/deps ファイルに下記を追加します。私は[doctrine]ブロックの上に追加しました。

...
[gedmo-doctrine-extensions]
git=https://github.com/l3pp4rd/DoctrineExtensions.git
target=/gedmo-doctrine-extensions
[DoctrineExtensionBundle]
git=https://github.com/stof/StofDoctrineExtensionsBundle.git
target=/bundles/Stof/DoctrineExtensionsBundle
...

インストール

下記コマンドを実行します。結構時間がかかります。

$ php bin/vendors install --reinstall

Symfony/app/autoload.phpの編集

Symfony/app/autoload.php の $loader->registerNamespaces() メソッドの引数に下記を追加します。私は一番下に追加しました。

$loader->registerNamespaces(array(
	...
    'Gedmo'            => __DIR__.'/../vendor/gedmo-doctrine-extensions/lib',
    'Stof'             => __DIR__.'/../vendor/bundles',
	...
));

Symfony/app/AppKernel.phpの編集

Symfony/app/AppKernel.php の registerBundles() メソッドの $bundles 変数に下記を追加します。私は一番下に追加しました。

public function registerBundles()
{
    ...
    $bundles = array(
        ...
		new Stof\DoctrineExtensionsBundle\StofDoctrineExtensionsBundle(),
        ...
    );
    ...
}

Symfony/app/config.ymlファイルの編集

Symfony/app/config.yml ファイルに下記を追加します。私は一番下に追加しました。

...
stof_doctrine_extensions:
    orm:
        default:
            timestampable: true
...

Entityの編集

createdAt と updateAt のアノテーションを編集します。

<?php
namespace My\BlogBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;

/**
 * My\BlogBundle\Entity\Post
 *
 * @ORM\Table(name="post")
 */
class Post
{
	// Properties
	// ...
	/**
     * @var datetime $createdAt
     *
     * @ORM\Column(name="created_at", type="datetime", nullable=false)
     * @Gedmo\Timestampable(on="create")
     */
    private $createdAt;

    /**
     * @var datetime $updatedAt
     *
     * @ORM\Column(name="updated_at", type="datetime", nullable=false)
     * @Gedmo\Timestampable(on="update")
     */
    private $updatedAt;

	// ...
	// Methods
	// ...
}

動作確認

エンティティマネージャ経由でデータを登録して createAt と updateAt が自動で設定されていることを確認します。

参考サイト

-技術ブログ
-