最近はSymfony2な日々を送っています。
アクティブレコードから解放された僕はフリーダムです。
で、やっぱりDoctrine2でも論理削除をしたいわけです。
ただ、ちょっと導入がやっかいというかサンプルがなかなか見つからなかったので見聞録としてここに残しておきます。
※今回使ってるsymfony2は2.2系です。2.1とかだと動くかどうかはわかりません。
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" }
2. 次に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 }
3. 適当なバンドルを用意して、イベントの設定をしましょう。
カーネルが呼ばれた際にエンティティマネージャーに対してフィルターを設定するイベントです。
vim TestHogeBundle/Event/DoctrineExtensionListener.php
<?php namespace Test\HogeBundle\Listener; use Symfony\Component\HttpKernel\Event\GetResponseEvent; use Symfony\Component\DependencyInjection\ContainerAwareInterface; use Symfony\Component\DependencyInjection\ContainerInterface; /** * @property ContainerInterface $container */ class DoctrineExtensionListener implements ContainerAwareInterface { /** * @var ContainerInterface */ protected $container; public function setContainer(ContainerInterface $container = null) { $this->container = $container; } public function onKernelRequest(GetResponseEvent $event) { $doctrine = $this->container->get('doctrine'); $doctrine->getEntityManager()->getConfiguration()->addFilter( 'soft-deleteable', 'Gedmo\SoftDeleteable\Filter\SoftDeleteableFilter' ); $em = $doctrine->getEntityManager(); $em->getFilters()->enable('soft-deleteable'); } }
あとは適当にEntintyクラスにコード書いてあげればうまく行きますよー。
てかうろ覚えなので抜けてるところあるかもです。