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

Converted SwiftmailerBundle to use a Configuration class

Christophe Coevoet 14 роки тому
батько
коміт
990910d601

+ 72 - 0
src/Symfony/Bundle/SwiftmailerBundle/DependencyInjection/Configuration.php

@@ -0,0 +1,72 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien.potencier@symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\SwiftmailerBundle\DependencyInjection;
+
+use Symfony\Component\DependencyInjection\Configuration\Builder\NodeBuilder;
+use Symfony\Component\DependencyInjection\Configuration\Builder\TreeBuilder;
+
+/**
+ * This class contains the configuration information for the bundle
+ *
+ * This information is solely responsible for how the different configuration
+ * sections are normalized, and merged.
+ *
+ * @author Christophe Coevoet <stof@notk.org>
+ */
+class Configuration
+{
+    /**
+     * Generates the configuration tree.
+     *
+     * @return \Symfony\Component\DependencyInjection\Configuration\NodeInterface
+     */
+    public function getConfigTree()
+    {
+        $treeBuilder = new TreeBuilder();
+        $rootNode = $treeBuilder->root('swiftmailer:config', 'array');
+
+        $rootNode
+            ->scalarNode('transport')
+                ->defaultValue('smtp')
+                ->validate()
+                    ->ifNotInArray(array ('smtp', 'mail', 'sendmail', 'gmail'))
+                    ->thenInvalid('The %s transport is not supported')
+                ->end()
+            ->end()
+            ->scalarNode('username')->defaultNull()->end()
+            ->scalarNode('password')->defaultNull()->end()
+            ->scalarNode('host')->defaultValue('localhost')->end()
+            ->scalarNode('port')->defaultValue(25)->end()
+            ->scalarNode('encryption')
+                ->defaultNull()
+                ->validate()
+                    ->ifNotInArray(array ('tls', 'ssl', null))
+                    ->thenInvalid('The %s encryption is not supported')
+                ->end()
+            ->end()
+            ->scalarNode('auth_mode')
+                ->defaultNull()
+                ->validate()
+                    ->ifNotInArray(array ('plain', 'login', 'cram-md5', null))
+                    ->thenInvalid('The %s authentication mode is not supported')
+                ->end()
+            ->end()
+            ->arrayNode('spool')
+                ->scalarNode('type')->defaultValue('file')->end()
+                ->scalarNode('path')->defaultValue('%kernel.cache_dir%/swiftmailer/pool')->end()
+            ->end()
+            ->scalarNode('delivery_adress')->end()
+            ->booleanNode('disable_delivery')->end();
+
+        return $treeBuilder->buildTree();
+    }
+}

+ 24 - 42
src/Symfony/Bundle/SwiftmailerBundle/DependencyInjection/SwiftmailerExtension.php

@@ -16,6 +16,7 @@ use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
 use Symfony\Component\DependencyInjection\ContainerBuilder;
 use Symfony\Component\DependencyInjection\Reference;
 use Symfony\Component\Config\FileLocator;
+use Symfony\Component\DependencyInjection\Configuration\Processor;
 
 /**
  * SwiftMailerExtension is an extension for the SwiftMailer library.
@@ -24,13 +25,6 @@ use Symfony\Component\Config\FileLocator;
  */
 class SwiftMailerExtension extends Extension
 {
-    public function load(array $configs, ContainerBuilder $container)
-    {
-        foreach ($configs as $config) {
-            $this->doConfigLoad($config, $container);
-        }
-    }
-
     /**
      * Loads the Swift Mailer configuration.
      *
@@ -45,64 +39,55 @@ class SwiftMailerExtension extends Extension
      * @param array            $config    An array of configuration settings
      * @param ContainerBuilder $container A ContainerBuilder instance
      */
-    protected function doConfigLoad(array $config, ContainerBuilder $container)
+    public function load(array $configs, ContainerBuilder $container)
     {
-        if (!$container->hasDefinition('swiftmailer.mailer')) {
-            $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
-            $loader->load('swiftmailer.xml');
-            $container->setAlias('mailer', 'swiftmailer.mailer');
-        }
+        $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
+        $loader->load('swiftmailer.xml');
+        $container->setAlias('mailer', 'swiftmailer.mailer');
 
         $r = new \ReflectionClass('Swift_Message');
         $container->setParameter('swiftmailer.base_dir', dirname(dirname(dirname($r->getFilename()))));
 
-        $transport = $container->getParameter('swiftmailer.transport.name');
-        if (array_key_exists('transport', $config)) {
-            if (null === $config['transport']) {
-                $transport = 'null';
-            } elseif ('gmail' === $config['transport']) {
-                $config['encryption'] = 'ssl';
-                $config['auth_mode'] = 'login';
-                $config['host'] = 'smtp.gmail.com';
-                $transport = 'smtp';
-            } else {
-                $transport = $config['transport'];
-            }
-
-            $container->setParameter('swiftmailer.transport.name', $transport);
+        $configuration = new Configuration();
+        $processor = new Processor();
+        $config = $processor->process($configuration->getConfigTree(), $configs);
+
+        if (null === $config['transport']) {
+            $transport = 'null';
+        } elseif ('gmail' === $config['transport']) {
+            $config['encryption'] = 'ssl';
+            $config['auth_mode'] = 'login';
+            $config['host'] = 'smtp.gmail.com';
+            $transport = 'smtp';
+        } else {
+            $transport = $config['transport'];
         }
 
+        $container->setParameter('swiftmailer.transport.name', $transport);
+
         $container->setAlias('swiftmailer.transport', 'swiftmailer.transport.'.$transport);
 
-        if (isset($config['encryption']) && 'ssl' === $config['encryption'] && !isset($config['port'])) {
+        if ('ssl' === $config['encryption'] && !isset($config['port'])) {
             $config['port'] = 465;
         }
 
         foreach (array('encryption', 'port', 'host', 'username', 'password', 'auth_mode') as $key) {
-            if (isset($config[$key])) {
-                $container->setParameter('swiftmailer.transport.'.$transport.'.'.$key, $config[$key]);
-            }
+            $container->setParameter('swiftmailer.transport.'.$transport.'.'.$key, $config[$key]);
         }
 
         // spool?
         if (isset($config['spool'])) {
-            $type = isset($config['spool']['type']) ? $config['spool']['type'] : 'file';
+            $type = $config['spool']['type'];
 
             $container->setAlias('swiftmailer.transport.real', 'swiftmailer.transport.'.$transport);
             $container->setAlias('swiftmailer.transport', 'swiftmailer.transport.spool');
             $container->setAlias('swiftmailer.spool', 'swiftmailer.spool.'.$type);
 
             foreach (array('path') as $key) {
-                if (isset($config['spool'][$key])) {
-                    $container->setParameter('swiftmailer.spool.'.$type.'.'.$key, $config['spool'][$key]);
-                }
+                $container->setParameter('swiftmailer.spool.'.$type.'.'.$key, $config['spool'][$key]);
             }
         }
 
-        if (array_key_exists('delivery-address', $config)) {
-            $config['delivery_address'] = $config['delivery-address'];
-        }
-
         if (isset($config['delivery_address']) && $config['delivery_address']) {
             $container->setParameter('swiftmailer.single_address', $config['delivery_address']);
             $container->findDefinition('swiftmailer.transport')->addMethodCall('registerPlugin', array(new Reference('swiftmailer.plugin.redirecting')));
@@ -110,9 +95,6 @@ class SwiftMailerExtension extends Extension
             $container->setParameter('swiftmailer.single_address', null);
         }
 
-        if (array_key_exists('disable-delivery', $config)) {
-            $config['disable_delivery'] = $config['disable-delivery'];
-        }
 
         if (isset($config['disable_delivery']) && $config['disable_delivery']) {
             $container->findDefinition('swiftmailer.transport')->addMethodCall('registerPlugin', array(new Reference('swiftmailer.plugin.blackhole')));

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

@@ -7,21 +7,12 @@
   <parameters>
     <parameter key="swiftmailer.class">Swift_Mailer</parameter>
 
-    <parameter key="swiftmailer.transport.name">smtp</parameter>
     <parameter key="swiftmailer.transport.smtp.class">Swift_Transport_EsmtpTransport</parameter>
     <parameter key="swiftmailer.transport.sendmail.class">Swift_Transport_SendmailTransport</parameter>
     <parameter key="swiftmailer.transport.mail.class">Swift_Transport_MailTransport</parameter>
 
-    <parameter key="swiftmailer.transport.smtp.host">localhost</parameter>
-    <parameter key="swiftmailer.transport.smtp.port">25</parameter>
-    <parameter key="swiftmailer.transport.smtp.encryption">null</parameter>
-    <parameter key="swiftmailer.transport.smtp.username">null</parameter>
-    <parameter key="swiftmailer.transport.smtp.password">null</parameter>
-    <parameter key="swiftmailer.transport.smtp.auth_mode">null</parameter>
-
     <parameter key="swiftmailer.transport.failover.class">Swift_Transport_FailoverTransport</parameter>
     <parameter key="swiftmailer.spool.file.class">Swift_FileSpool</parameter>
-    <parameter key="swiftmailer.spool.file.path">%kernel.cache_dir%/swiftmailer/pool</parameter>
 
     <parameter key="swiftmailer.init_file">%swiftmailer.base_dir%/swift_init.php</parameter>