<?php
declare(strict_types=1);
namespace Novaway\MailerBundle\DependencyInjection;
use Novaway\MailerBundle\MailSender;
use Novaway\MailerBundle\Transport\Mailjet\MailjetTransport;
use Novaway\MailerBundle\Transport\Sendinblue\SendinblueTransport;
use Novaway\MailerBundle\Transport\SwiftMailer\SwiftMailerTransport;
use Novaway\MailerBundle\Transport\SymfonyMailer\SymfonyMailerTransport;
use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Extension\Extension;
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
class NovawayMailerExtension extends Extension
{
protected $requiredParameters = [
'default_email_from'
];
public function load(array $configs, ContainerBuilder $container)
{
$xmlLoader = new XmlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config'));
$xmlLoader->load('services.xml');
$configuration = new NovawayMailerConfiguration($container->getParameter('kernel.debug'));
$config = $this->processConfiguration($configuration, $configs);
foreach ($config as $key => $value) {
// Services will be processed later in a Novaway\MailerBundle\DependencyInjection\CompilerPass\RegisterServicesPass
// As at that point they may not have been defined yet
$parameterName = \sprintf('%s.%s', $this->getAlias(), $key);
if ($container->hasParameter($parameterName)) {
\trigger_deprecation('novaway/mailer-bundle', '1.7', 'Passing configuration by single value parameter is deprecated since 1.7, and may be removed in 2.0. Please use an array parameter');
}
// Condition will be removed in v2.0
if (!$container->hasParameter($parameterName)) {
$container->setParameter(\sprintf('%s.%s', $this->getAlias(), $key), $value);
}
}
foreach ($this->requiredParameters as $key) {
$parameterName = \sprintf('%s.%s', $this->getAlias(), $key);
if (!$container->hasParameter($parameterName)) {
throw new InvalidConfigurationException(\sprintf('The parameter "%s" is required by configuration', $parameterName));
}
}
$transports = $container->getParameter( \sprintf('%s.%s', $this->getAlias(), 'transports'));
if (empty($transports)) {
$transports = [$container->getParameter( \sprintf('%s.%s', $this->getAlias(), 'transport'))];
}
$transports = \array_filter($transports);
$senderConfiguration = $container->findDefinition(MailSender::class);
foreach ($transports as $transport) {
switch ($transport) {
case 'swiftmailer':
$xmlLoader->load('swiftmailer.xml');
$senderConfiguration->addMethodCall('addTransport', [$container->findDefinition(SwiftMailerTransport::class)]);
break;
case 'mailjet':
$xmlLoader->load('mailjet.xml');
$senderConfiguration->addMethodCall('addTransport', [$container->findDefinition(MailjetTransport::class)]);
break;
case 'sendinblue':
$xmlLoader->load('sendinblue.xml');
$senderConfiguration->addMethodCall('addTransport', [$container->findDefinition(SendinblueTransport::class)]);
break;
case 'symfony':
$xmlLoader->load('symfony.xml');
$senderConfiguration->addMethodCall('addTransport', [$container->findDefinition(SymfonyMailerTransport::class)]);
break;
}
}
}
}