Symfony 3.4:更改SwiftMailer的smtp设置

时间:2018-06-15 20:23:34

标签: symfony fosuserbundle swiftmailer

我是Symfony的新手。我们正在使用Symfony 3.4和FOSUserBundle。此客户端希望通过接口指定自己的smtp服务器设置(主机,端口,密码等)并存储在数据库表中。我研究了解决这个问题的方法,发现这个有希望的线程正是通过事件监听器(Mun Mun Das的回答)完成的:

Changing smtp settings in SwiftMailer dynamically

不幸的是,我认为这是未经测试的代码,我无法实现它。我尝试了许多事情来解决当前的问题但决定重新开始。在对该代码进行了前几个明显的修复后,我的监听器看起来像:

<?php

namespace AppBundle\EventListener;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;

class SwiftMailerListener implements EventSubscriberInterface
{

    private $transport;
    private $em;

    public function __construct($transport, $em)
    {
        $this->transport = $transport;
        $this->em = $em;
    }

    public function onKernelRequest(GetResponseEvent $event)
    {
        $this->transport->setHost("host");
        $this->transport->setPort("port");
        $this->transport->setUserName("username");
        $this->transport->setPassword("pass");
    }

    static public function getSubscribedEvents()
    {
        return array(
            KernelEvents::REQUEST => array('onKernelRequest', 0)
        );
    }

}

以及services.yml中的相关部分:

swiftmailer_listener:
    class: AppBundle\EventListener\SwiftMailerListener
    tags:
        - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
    arguments: ["@swiftmailer.transport.real", "@doctrine.orm.entity_manager"]         

这给了我错误:

(1/1) RuntimeException Cannot autowire service
"AppBundle\EventListener\SwiftMailerListener": argument "$transport" 
of method "__construct()" must have a type-hint or be given a value
explicitly.

我现在正在努力弄清楚要使用什么类型的提示(仍然掌握Symfony的“土地”)以及为什么它在这里是必要的而不是在示例中。

任何关于修复的想法,适当的研究途径,甚至是我正在努力实现的替代方法?

2 个答案:

答案 0 :(得分:0)

如果要在捆绑软件文件夹下的service.yml文件中定义服务,请尝试将其移至主服务文件&#34; app / config / services.yml&#34;,请参阅此link

答案 1 :(得分:0)

也许找不到swiftmailer.transport.real

尝试仅使用@mailer 在symfony 3.4中,您可以使用依赖注入和自动装配。

如果要动态更改主机和端口,可以使用symfony 3.4中已存在的环境变量。您可以轻松地动态更改它们。  如果您不想动态更改它,可以将主机和端口以及其他所有内容放在parameters.yml邮件配置所在的位置。