Doctrine 2.2とSymfony2.2での論理削除の導入
※めっちゃ間違っていたので訂正してあります(2013/07/11)
最近はSymfony2な日々を送っています。
アクティブレコードから解放された僕はフリーダムです。
で、やっぱりDoctrine2でも論理削除をしたいわけです。
ただ、ちょっと導入がやっかいというかサンプルがなかなか見つからなかったので見聞録としてここに残しておきます。
※今回使ってるsymfony2は2.2系です。2.1とかだと動くかどうかはわかりません。
まずは論理削除用のDoctrineの拡張を取得する
https://github.com/l3pp4rd/DoctrineExtensions/blob/master/doc/softdeleteable.md
composer.jsonのrequireの中に以下のように記載すればcomposer installで入るかと思います。
ちゃんとオートローダーの設定もしてあげるところがポイントです。
...
"psr-0": {
"Gedmo\\": "vendor/gedmo/doctrine-extensions/lib"
},
...
"require" {
...
"gedmo/doctrine-extensions": "dev-master"
}
次にapp/config.ymlに以下のように記載します。
imports:
...
- { resource: doctrine_extensions.yml }
そして、app/doctrine_extensions.ymlを用意します。
中身は以下のように記載します。
services:
gedmo.listener.softdeleteable:
class: Gedmo\SoftDeleteable\SoftDeleteableListener
calls:
- [ setAnnotationReader, [ "@annotation_reader" ] ]
tags:
- { name: doctrine.event_subscriber, connection: default }
config.ymlのDoctrineの設定部分をいじります。
ormの部分にfiltersの定義をしていきましょう。
doctrine:
dbal:
driver: %database_driver%
host: %database_host%
port: %database_port%
dbname: %database_name%
user: %database_user%
password: %database_password%
charset: UTF8
# if using pdo_sqlite as your database driver, add the path in parameters.yml
# e.g. database_path: %kernel.root_dir%/data/data.db3
# path: %database_path%
orm:
auto_generate_proxy_classes: %kernel.debug%
auto_mapping: true
filters:
softdeleteable:
class: Gedmo\SoftDeleteable\Filter\SoftDeleteableFilter
enabled: true
論理削除を有効にいしたいエンティティに設定
最後にエンティティの設定をしていきます。
僕はアノテーション派なのです、xmlとかymlの人は適当に書き換えてください。
アノテーションだと、Gedmo\Mapping\Annotationの定義である「 @Gedmo\SoftDeleteable(fieldName=”deletedAt”)」を記載してあげただけです。
<?php
namespace Hoge\Fuga\Entity;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
/**
* Uho entity class
*
* @ORM\Table(name="uho")
* @ORM\Entity
*
* @Gedmo\SoftDeleteable(fieldName="deletedAt")
*/
class Uho
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
private $name;
….
これで、めでたく論理削除が実装できますとさ。おしまい。