Jelajahi Sumber

[DoctrineMongoDBBundle] added registration of event listeners and subscribers via service container tags

Kris Wallsmith 14 tahun lalu
induk
melakukan
9ab33e4ae4

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

@@ -133,7 +133,8 @@ class DoctrineMongoDBExtension extends Extension
 
         $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(sprintf('doctrine.odm.mongodb.%s_configuration', $documentManager['name'])),
+            new Reference('doctrine.odm.mongodb.event_manager'),
         );
         $odmDmDef = new Definition('%doctrine.odm.mongodb.document_manager_class%', $odmDmArgs);
         $odmDmDef->setFactoryMethod('create');

+ 57 - 0
src/Symfony/Bundle/DoctrineMongoDBBundle/Event/EventManager.php

@@ -0,0 +1,57 @@
+<?php
+
+namespace Symfony\Bundle\DoctrineMongoDBBundle\Event;
+
+use Doctrine\Common\EventManager as BaseEventManager;
+use Symfony\Component\DependencyInjection\TaggedContainerInterface;
+
+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
+     */
+    public function loadTaggedEventListeners(TaggedContainerInterface $container)
+    {
+        foreach ($container->findTaggedServiceIds('doctrine.odm.mongodb.event_listener') as $id => $instances) {
+            $events = array();
+            foreach ($instances as $attributes) {
+                if (isset($attributes['event'])) {
+                    $events[] = $attributes['event'];
+                }
+            }
+
+            if (0 < count($events)) {
+                $this->addEventListener($events, $container->get($id));
+            }
+        }
+    }
+
+    /**
+     * Loads event subscribers from the service container.
+     *
+     * 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
+     */
+    public function loadTaggedEventSubscribers(TaggedContainerInterface $container)
+    {
+        foreach ($container->findTaggedServiceIds('doctrine.odm.mongodb.event_subscriber') as $id => $instances) {
+            $this->addEventSubscriber($container->get($id));
+        }
+    }
+}

+ 11 - 0
src/Symfony/Bundle/DoctrineMongoDBBundle/Resources/config/mongodb.xml

@@ -14,6 +14,7 @@
     <parameter key="doctrine.odm.mongodb.document_manager_class">Doctrine\ODM\MongoDB\DocumentManager</parameter>
     <parameter key="doctrine.odm.mongodb.logger_class">Symfony\Bundle\DoctrineMongoDBBundle\Logger\DoctrineMongoDBLogger</parameter>
     <parameter key="doctrine.odm.mongodb.data_collector_class">Symfony\Bundle\DoctrineMongoDBBundle\DataCollector\DoctrineMongoDBDataCollector</parameter>
+    <parameter key="doctrine.odm.mongodb.event_manager_class">Symfony\Bundle\DoctrineMongoDBBundle\Event\EventManager</parameter>
 
     <!-- proxies -->
     <parameter key="doctrine.odm.mongodb.proxy_namespace">Proxies</parameter>
@@ -80,5 +81,15 @@
     </service>
 
     <service id="security.user.document_manager" alias="doctrine.odm.mongodb.default_document_manager" />
+
+    <!-- events -->
+    <service id="doctrine.odm.mongodb.event_manager" class="%doctrine.odm.mongodb.event_manager_class%">
+      <call method="loadTaggedEventListeners">
+        <argument type="service" id="service_container" />
+      </call>
+      <call method="loadTaggedEventSubscribers">
+        <argument type="service" id="service_container" />
+      </call>
+    </service>
   </services>
 </container>