【问题标题】:Symfony 2.3: How do you configure SwiftMailer to automatically use a custom plugin?Symfony 2.3:如何配置 SwiftMailer 以自动使用自定义插件?
【发布时间】:2016-07-30 00:07:49
【问题描述】:

我创建了一个自定义 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 也未使用该插件。我是不是做错了什么,还有什么我应该做的吗?

【问题讨论】:

  • 看来您的做法是正确的。在 symfony 之外使用时,你的插件能正常工作吗?
  • 当发生奇怪的事情时,首先要做的是:清除缓存。是你做的吗? :)
  • @cheesemacfly 是的,如果我直接在邮件对象上注册它就可以工作
  • @dlondero 是的,我确实清除了缓存它仍然无法正常工作。
  • 你能看到你的服务在做什么php app/console container:debug

标签: php symfony swiftmailer symfony-2.3


【解决方案1】:

我自己设法解决了这个问题。

与 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 }

【讨论】:

    【解决方案2】:

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

    当不对 swiftmailer 使用多个 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 }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-11
      • 2020-03-22
      • 2014-05-03
      • 2021-08-23
      • 1970-01-01
      • 2019-11-02
      • 2011-02-02
      • 2018-03-24
      相关资源
      最近更新 更多