Doctrine 2.2とSymfony2.2での論理削除の導入

Twitter ツイート Hatena Bookmark ブックマーク

※めっちゃ間違っていたので訂正してあります(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で入るかと思います。
ちゃんとオートローダーの設定もしてあげるところがポイントです。

1
2
3
4
5
6
7
8
9
...
"psr-0": {
   "Gedmo\\": "vendor/gedmo/doctrine-extensions/lib"
},
...
"require" {
   ...
   "gedmo/doctrine-extensions":      "dev-master"
}

次にapp/config.ymlに以下のように記載します。

1
2
3
imports:
   ...
   - { resource: doctrine_extensions.yml }

そして、app/doctrine_extensions.ymlを用意します。
中身は以下のように記載します。

1
2
3
4
5
6
7
services:
    gedmo.listener.softdeleteable:
        class: Gedmo\SoftDeleteable\SoftDeleteableListener
        calls:
            - [ setAnnotationReader, [ "@annotation_reader" ] ]
        tags:
            - { name: doctrine.event_subscriber, connection: default }

config.ymlのDoctrineの設定部分をいじります。

ormの部分にfiltersの定義をしていきましょう。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
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”)」を記載してあげただけです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?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;

 .

これで、めでたく論理削除が実装できますとさ。おしまい。

参考
Doctrine 2.2, SoftDeleteable behavior et Symfony 2

comments powered by Disqus
Built with Hugo
テーマ StackJimmy によって設計されています。