Skip to content

Commit

Permalink
Converted SwiftmailerBundle to use a Configuration class
Browse files Browse the repository at this point in the history
  • Loading branch information
stof authored and fabpot committed Feb 16, 2011
1 parent ee8ad0c commit 990910d
Show file tree
Hide file tree
Showing 3 changed files with 96 additions and 51 deletions.
@@ -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();
}
}
Expand Up @@ -16,6 +16,7 @@
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.
Expand All @@ -24,13 +25,6 @@
*/
class SwiftMailerExtension extends Extension
{
public function load(array $configs, ContainerBuilder $container)
{
foreach ($configs as $config) {
$this->doConfigLoad($config, $container);
}
}

/**
* Loads the Swift Mailer configuration.
*
Expand All @@ -45,74 +39,62 @@ public function load(array $configs, ContainerBuilder $container)
* @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')));
} else {
$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')));
Expand Down
Expand Up @@ -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>

Expand Down

0 comments on commit 990910d

Please sign in to comment.