Я новичок в Symfony. Мы используем Symfony 3.4 и FOSUserBundle. Этот клиент хотел бы указать свои собственные настройки SMTP-сервера (хост, порт, пароль и т. д.) Через интерфейс и сохранить их в таблице базы данных. Я исследовал способы сделать это и обнаружил, что эта многообещающая ветка делает именно это с помощью прослушивателя событий (ответ Мун Мун Дас):
Динамическое изменение настроек smtp в SwiftMailer
К сожалению, я думаю, что это был непроверенный код, и у меня возникли проблемы с его реализацией. Я пробовал много вещей, чтобы обойти текущую проблему, но решил начать заново. После нескольких первых очевидных исправлений этого кода мой слушатель выглядит так:
<?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) и почему это необходимо здесь, а не в примере.
Есть ли идеи для исправления, подходящее направление исследования или даже альтернативный подход к тому, что я пытаюсь достичь?




Если вы определяете свою службу в файле service.yml в папке вашего пакета, попробуйте переместить ее в основной файл служб "app / config / services.yml", см. Этот ссылка на сайт
Может он не может найти swiftmailer.transport.real.
Попробуйте использовать только @mailer
А в symfony 3.4 вы можете использовать только внедрение зависимостей и автоматическое подключение.
Если вы хотите динамически изменять хост и порт, вы можете использовать переменные окружения, которые уже существуют в symfony 3.4. Вы можете легко изменять их динамически.
Если вы не хотите изменять его динамически, вы можете поместить хост, порт и все остальное в parameters.yml, где находится конфигурация почты.
Я определяю его в app / config / services.yml, но спасибо за ссылку. Я проверю.