Symfony 2.3: как настроить SwiftMailer для автоматического использования собственного плагина?
Я создал собственный плагин SwiftMailer, который я бы хотел, чтобы SwiftMailer по умолчанию использовался в моем приложении Symfony 2.3. Единственная документация, которую я могу найти в этом отношении, находится здесь: http://symfony.com/doc/current/reference/dic_tags.html
Я настроил сервис следующим образом:
acme_test_bundle.swiftmailer.embed_images:
class: Acme\TestBundle\SwiftMailer\Plugins\ImageEmbedPlugin
tags:
- { name: swiftmailer.plugin }
SwiftMailer не использует плагин, хотя этот сервис был создан. Я сделал что-то не так и есть ли что-то еще, что я должен делать?
2 ответа
Мне удалось понять это самому.
Вопреки тому, что написано в документации Symfony 2.3, вам нужно пометить службу, с которой вы будете использовать почтовую программу (обычно "по умолчанию").
Поэтому мне нужно было изменить swiftmailer.plugin на swiftmailer.default.plugin.
Итак, определение сервиса теперь:
acme_test_bundle.swiftmailer.embed_images:
class: Acme\TestBundle\SwiftMailer\Plugins\ImageEmbedPlugin
tags:
- { name: swiftmailer.default.plugin }
Чтобы обеспечить некоторый дополнительный контекст для ответа ОП.
Начиная с Symfony 2.3 в процессе SwiftmailerBundle CompilerPass, он выполняет следующее.
$mailers = $container->getParameter('swiftmailer.mailers');
foreach ($mailers as $name => $mailer) {
$plugins = $container->findTaggedServiceIds(sprintf('swiftmailer.%s.plugin', $name));
foreach ($plugins as $id => $args) {
$transport->addMethodCall('registerPlugin', [new Reference($id)]);
}
}
Исходя из этого, вам нужно будет добавить все имена почтовых программ в ваши теги, к которым вы хотите добавить плагин, в формате swiftmailer.%mailer_name%.plugin
, Замена %mailer_name%
с именем ваших почтовиков.
Когда не используется несколько mailers
Конфигурация для быстрой доставки %mailer_name%
является default
который установлен в конфигурации пакета.
$v['default_mailer'] = isset($v['default_mailer']) ? (string) $v['default_mailer'] : 'default';
$v['mailers'] = array($v['default_mailer'] => $mailer);
Пример config.yml
swiftmailer:
default_mailer: first_mailer #alias: default
mailers:
first_mailer:
#...
second_mailer:
#...
services:
#...
swiftmailer.plugin.array_logger:
class: Swift_Plugins_Loggers_ArrayLogger
swiftmailer.plugin.logger:
class: Swift_Plugins_LoggerPlugin
arguments: ['@swiftmailer.plugin.array_logger']
tags:
- { name: swiftmailer.default.plugin }
- { name: swiftmailer.second_mailer.plugin }