Quantcast
Channel: polidog lab++
Viewing all articles
Browse latest Browse all 48

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

$
0
0

最近は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クラスにコード書いてあげればうまく行きますよー。
てかうろ覚えなので抜けてるところあるかもです。

参考
Doctrine 2.2, SoftDeleteable behavior et Symfony 2


Viewing all articles
Browse latest Browse all 48

Trending Articles