Ver código fonte

[SwiftMailer] optimized configuration

* Removed the requirement of the init.php file when getting the Swift_Mailer object (must now be done via autoloading -- see Symfony SE)
* Changed the data collector to avoid loading Swiftmailer when no email has been send
Fabien Potencier 14 anos atrás
pai
commit
5ed136b3f1

+ 25 - 8
src/Symfony/Bundle/SwiftmailerBundle/DataCollector/MessageDataCollector.php

@@ -14,6 +14,7 @@ namespace Symfony\Bundle\SwiftmailerBundle\DataCollector;
 use Symfony\Component\HttpKernel\DataCollector\DataCollector;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * MessageDataCollector.
@@ -23,13 +24,21 @@ use Symfony\Component\HttpFoundation\Response;
  */
 class MessageDataCollector extends DataCollector
 {
-    protected $logger;
-    protected $mailer;
+    private $container;
+    private $isSpool;
 
-    public function __construct(\Swift_Events_SendListener $logger, \Swift_Mailer $mailer)
+    /**
+     * Constructor.
+     *
+     * We don't inject the message logger and mailer here
+     * to avoid the creation of these objects when no emails are sent.
+     *
+     * @param ContainerInterface $container A ContainerInterface instance
+     */
+    public function __construct(ContainerInterface $container, $isSpool)
     {
-        $this->logger = $logger;
-        $this->mailer = $mailer;
+        $this->container = $container;
+        $this->isSpool = $isSpool;
     }
 
     /**
@@ -37,9 +46,17 @@ class MessageDataCollector extends DataCollector
      */
     public function collect(Request $request, Response $response, \Exception $exception = null)
     {
-        $this->data['messages']     = $this->logger->getMessages();
-        $this->data['messageCount'] = $this->logger->countMessages();
-        $this->data['isSpool']      = $this->mailer->getTransport() instanceof \Swift_Transport_SpoolTransport;
+        // only collect when Swiftmailer has already been initialized
+        if (in_array('Swift_Mailer', get_declared_classes())) {
+            $logger = $this->container->get('swiftmailer.plugin.messagelogger');
+            $this->data['messages']     = $logger->getMessages();
+            $this->data['messageCount'] = $logger->countMessages();
+        } else {
+            $this->data['messages']     = array();
+            $this->data['messageCount'] = 0;
+        }
+
+        $this->data['isSpool'] = $this->isSpool;
     }
 
     public function getMessageCount()

+ 1 - 3
src/Symfony/Bundle/SwiftmailerBundle/DependencyInjection/SwiftmailerExtension.php

@@ -45,9 +45,6 @@ class SwiftmailerExtension extends Extension
         $loader->load('swiftmailer.xml');
         $container->setAlias('mailer', 'swiftmailer.mailer');
 
-        $r = new \ReflectionClass('Swift_Message');
-        $container->getDefinition('swiftmailer.mailer')->setFile(dirname(dirname(dirname($r->getFilename()))).'/swift_init.php');
-
         $processor = new Processor();
         $configuration = new Configuration($container->getParameter('kernel.debug'));
         $config = $processor->processConfiguration($configuration, $configs);
@@ -92,6 +89,7 @@ class SwiftmailerExtension extends Extension
                 $container->setParameter('swiftmailer.spool.'.$type.'.'.$key, $config['spool'][$key]);
             }
         }
+        $container->setParameter('swiftmailer.spool.enabled', isset($config['spool']));
 
         if ($config['logging']) {
             $container->findDefinition('swiftmailer.transport')->addMethodCall('registerPlugin', array(new Reference('swiftmailer.plugin.messagelogger')));

+ 3 - 3
src/Symfony/Bundle/SwiftmailerBundle/Resources/config/swiftmailer.xml

@@ -63,11 +63,11 @@
 
         <service id="swiftmailer.plugin.blackhole" class="%swiftmailer.plugin.blackhole.class%" public="false" />
 
-        <service id="swiftmailer.plugin.messagelogger" class="%swiftmailer.plugin.messagelogger.class%" public="false" />
+        <service id="swiftmailer.plugin.messagelogger" class="%swiftmailer.plugin.messagelogger.class%" />
 
         <service id="swiftmailer.data_collector" class="%swiftmailer.data_collector.class%" public="false">
-            <argument type="service" id="swiftmailer.plugin.messagelogger" />
-            <argument type="service" id="swiftmailer.mailer" />
+            <argument type="service" id="service_container" />
+            <argument>%swiftmailer.spool.enabled%</argument>
         </service>
 
         <service id="swiftmailer.transport" alias="swiftmailer.transport.smtp" public="false" />