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 }
Другие вопросы по тегам