Doctrine 1.1 is now available!

Today I am very pleased to bring news to you that Doctrine 1.1.0 stable is available.

http://www.doctrine-project.org/blog/doctrine-1-1-released

ついにDoctrineの1.1が正式リリースされました。長かったですが、バグフィックスをがんばってたんですかね。

Hilights

  • Hydration用のメソッドの追加
  • マイグレーション用のDiffツールを追加
  • fromArray()およびtoArray()でカスタムアクセサのサポート
  • getModified(), toArray(), fromArray(), synchronizeWithArray()の改善
  • Searchable, SoftDelete, Versionableビヘイビアの改善
  • 様々なAPIの改善や追加
  • その他バグフィックス

いくつかの修正に関しては以前書いた(Doctrine 1.1 Alphaがリリース - ゆっくり*ゆっくり)のですが、それ以外の点について簡単にいくつかピックアップしてみます。

SoftDelete

SoftDeleteビヘイビアは、以前会社のブログ(Doctrineで論理削除を意識せずに扱う - アシアルブログ)でも紹介したのですが、deletedというboolean型のカラムを用いて論理削除を実装するためのテンプレートでした。

これが1.1からは、booleanからtimestampになり、カラム名もdeleted_atに変更されました。これにより、レコードに対してdeleteを発行した際にdeleted_atに削除時のタイムスタンプが自動的に入るようになり、deleted_atがNULLでないものは削除済みとみなす、という実装になっています。

一応互換性を考慮して、以前のbooleanでの論理削除の対応もされているみたいです。

Custom Accessor/Mutator

Accessorはゲッター、Mutatorはセッターです。通常、$user->get('name')を行った際に、Doctrine内部の属性「Doctrine::ATTR_AUTO_ACCESSOR_OVERRIDE」がtrueに設定されている場合はgetName()が実装されていればそのメソッドを見るというものでした。

ようするにset + カラム名のメソッドという名前に限定されていましたが、これのメソッド名を自由に設定できるようになりました。

<?php

public function setTableDefinition()
{
    $this->hasColumn('username', 'string');
}

public function setUp()
{
    $this->hasAccessor('username', 'customUsernameAccessor');
    $this->hasMutator('username', 'customUsernameMutator');
}

public function customUsernameAccessor()
{
    return $this->_get('username');
}

public function customUsernameMutator($value)
{
    $this->_set('username', $value);
}

RecordListener

RecordListenerの有効/無効の切り替えが簡単にできるようになりました

<?php

// 全てのレコードリスナーの全てのリスナーメソッドを無効
Doctrine::getTable('Foo')->getRecordListener()->setOption('disabled', true);

// 全てのレコードリスナーから指定したリスナーメソッドを無効
Doctrine::getTable('Foo')->getRecordListener()->setOption('disabled', 
  array('preSerialize', 'postHydrate'));

// 指定したレコードリスナーの全てのリスナーメソッドを無効
Doctrine::getTable('Foo')->getRecordListener()->get('FooListener')
  ->setOption('disabled', true);

// 指定したレコードリスナーの指定したリスナーメソッドを無効
Doctrine::getTable('Foo')->getRecordListener()->get('FooListener')
  ->setOption('disabled', array('preSave', 'postInsert'));

有効はenableっぽいです。ソースコードは見てないので間違ってるかもしれませんが。
disabledオプションがtrueもしくは配列でかつ該当するリスナーメソッドが含まれている場合に無効になるようです。setOptionメソッドにtrueもしくは不要なものを除いた配列を渡せばOKっぽいです。


他にも色々修正されているみたいです。興味があれば以下のページを眺めてみるといいかもしれません。

http://www.doctrine-project.org/upgrade/1_1

次のバージョンとして、Tracのロードマップ上に1.2があるようです。まだブランチは切られていないみたいですが、一応リリースは6月1日となっています。

その次はいよいよ2.0になるんですかね。あと半年もないのかー。そもそもPHP 5.3がリリースされてないし、2.0はまだまだかかりそうな予感です。