Переглянути джерело

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

Kris Wallsmith 14 роки тому
батько
коміт
da188734d8

+ 18 - 2
src/Symfony/Bundle/DoctrineMongoDBBundle/DependencyInjection/DoctrineMongoDBExtension.php

@@ -131,14 +131,30 @@ class DoctrineMongoDBExtension extends Extension
             $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(
             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('doctrine.odm.mongodb.event_manager'),
+            new Reference($eventManagerId),
         );
         $odmDmDef = new Definition('%doctrine.odm.mongodb.document_manager_class%', $odmDmArgs);
         $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) {
             $container->setAlias(

+ 6 - 16
src/Symfony/Bundle/DoctrineMongoDBBundle/Event/EventManager.php

@@ -10,19 +10,12 @@ class EventManager extends BaseEventManager
     /**
      * 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 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();
             foreach ($instances as $attributes) {
                 if (isset($attributes['event'])) {
@@ -42,15 +35,12 @@ class EventManager extends BaseEventManager
      * A service can be marked as an event subscriber using the
      * "doctrine.odm.mongodb.event_subscriber" tag:
      *
-     *     <service class="MySubscriber">
-     *         <tag name="doctrine.odm.mongodb.event_subscriber" />
-     *     </service>
-     *
      * @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));
         }
     }