我是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的“土地”)以及为什么它在这里是必要的而不是在示例中。
任何关于修复的想法,适当的研究途径,甚至是我正在努力实现的替代方法?
答案 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
邮件配置所在的位置。