8

我创建了一个自定义 SwiftMailer 插件,我希望 SwiftMailer 在我的 Symfony 2.3 应用程序中默认使用。在这方面我能找到的唯一文档是:http: //symfony.com/doc/current/reference/dic_tags.html#swiftmailer-plugin

我已将服务设置如下:

acme_test_bundle.swiftmailer.embed_images:
    class: Acme\TestBundle\SwiftMailer\Plugins\ImageEmbedPlugin
    tags:
        - { name: swiftmailer.plugin }

即使已创建此服务,SwiftMailer 也未使用该插件。我做错了什么,还有什么我应该做的吗?

4

2 回答 2

6

我自己设法弄清楚了这一点。

与 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 }
于 2013-10-29T18:23:00.390 回答
3

为 OP 的答案提供一些额外的背景信息。

从 SwiftmailerBundle CompilerPass 进程中的 Symfony 2.3 开始,它执行以下操作。

$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%为您的邮寄者的名称。

当不使用mailersswiftmailer 的多重配置时,%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 }
于 2016-07-29T15:59:10.223 回答