[DoctrineMongoDBBundle] added support for multiple event managers to the DIC extension

This commit is contained in:
Kris Wallsmith 2010-11-05 15:16:31 -07:00 committed by Fabien Potencier
parent 9ab33e4ae4
commit da188734d8
2 changed files with 24 additions and 18 deletions

View File

@ -131,14 +131,30 @@ class DoctrineMongoDBExtension extends Extension
$odmConfigDef->addMethodCall($method, array($arg)); $odmConfigDef->addMethodCall($method, array($arg));
} }
// event manager
$eventManagerName = isset($documentManager['event_manager']) ? $documentManager['event_manager'] : $documentManager['name'];
$eventManagerId = sprintf('doctrine.odm.mongodb.%s_event_manager', $eventManagerName);
if (!$container->hasDefinition($eventManagerId)) {
$eventManagerDef = new Definition('%doctrine.odm.mongodb.event_manager_class%');
$eventManagerDef->addMethodCall('loadTaggedEventListeners', array(
new Reference('service_container'),
sprintf('doctrine.odm.mongodb.%s_event_listener', $eventManagerName),
));
$eventManagerDef->addMethodCall('loadTaggedEventSubscribers', array(
new Reference('service_container'),
sprintf('doctrine.odm.mongodb.%s_event_subscriber', $eventManagerName),
));
$container->setDefinition($eventManagerId, $eventManagerDef);
}
$odmDmArgs = array( $odmDmArgs = array(
new Reference(sprintf('doctrine.odm.mongodb.%s_connection', isset($documentManager['connection']) ? $documentManager['connection'] : $documentManager['name'])), new Reference(sprintf('doctrine.odm.mongodb.%s_connection', isset($documentManager['connection']) ? $documentManager['connection'] : $documentManager['name'])),
new Reference(sprintf('doctrine.odm.mongodb.%s_configuration', $documentManager['name'])), new Reference(sprintf('doctrine.odm.mongodb.%s_configuration', $documentManager['name'])),
new Reference('doctrine.odm.mongodb.event_manager'), new Reference($eventManagerId),
); );
$odmDmDef = new Definition('%doctrine.odm.mongodb.document_manager_class%', $odmDmArgs); $odmDmDef = new Definition('%doctrine.odm.mongodb.document_manager_class%', $odmDmArgs);
$odmDmDef->setFactoryMethod('create'); $odmDmDef->setFactoryMethod('create');
$container->setDefinition(sprintf('doctrine.odm.mongodb.%s_document_manager', $documentManager['name']), $odmDmDef ); $container->setDefinition(sprintf('doctrine.odm.mongodb.%s_document_manager', $documentManager['name']), $odmDmDef);
if ($documentManager['name'] == $defaultDocumentManager) { if ($documentManager['name'] == $defaultDocumentManager) {
$container->setAlias( $container->setAlias(

View File

@ -10,19 +10,12 @@ class EventManager extends BaseEventManager
/** /**
* Loads event listeners from the service container. * Loads event listeners from the service container.
* *
* A service can be marked as an event listener using the
* "doctrine.odm.mongodb.event_listener" tag:
*
* <service class="MyListener">
* <tag name="doctrine.odm.mongodb.event_listener" event="prePersist" />
* <tag name="doctrine.odm.mongodb.event_listener" event="preUpdate" />
* </service>
*
* @param TaggedContainerInterface $container The service container * @param TaggedContainerInterface $container The service container
* @param string $tagName The name of the tag to load
*/ */
public function loadTaggedEventListeners(TaggedContainerInterface $container) public function loadTaggedEventListeners(TaggedContainerInterface $container, $tagName)
{ {
foreach ($container->findTaggedServiceIds('doctrine.odm.mongodb.event_listener') as $id => $instances) { foreach ($container->findTaggedServiceIds($tagName) as $id => $instances) {
$events = array(); $events = array();
foreach ($instances as $attributes) { foreach ($instances as $attributes) {
if (isset($attributes['event'])) { if (isset($attributes['event'])) {
@ -42,15 +35,12 @@ class EventManager extends BaseEventManager
* A service can be marked as an event subscriber using the * A service can be marked as an event subscriber using the
* "doctrine.odm.mongodb.event_subscriber" tag: * "doctrine.odm.mongodb.event_subscriber" tag:
* *
* <service class="MySubscriber">
* <tag name="doctrine.odm.mongodb.event_subscriber" />
* </service>
*
* @param TaggedContainerInterface $container The service container * @param TaggedContainerInterface $container The service container
* @param string $tagName The name of the tag to load
*/ */
public function loadTaggedEventSubscribers(TaggedContainerInterface $container) public function loadTaggedEventSubscribers(TaggedContainerInterface $container, $tagName)
{ {
foreach ($container->findTaggedServiceIds('doctrine.odm.mongodb.event_subscriber') as $id => $instances) { foreach ($container->findTaggedServiceIds($tagName) as $id => $instances) {
$this->addEventSubscriber($container->get($id)); $this->addEventSubscriber($container->get($id));
} }
} }