以供將來參考,這裏是實施Peter's answer:
Custom mailer for FOSUserBundle配置:
# app/config/config.yml
fos_user:
# ...
service:
mailer: acme.mailer
和
# src/Acme/UserBundle/config/services.xml
<service id="acme.mailer.factory" class="Acme\UserBundle\Service\TwigSwiftMailerFactory" public="false">
<call method="setContainer">
<argument type="service" id="service_container" />
</call>
</service>
<service id="acme.mailer" class="TwigSwiftMailer">
<factory service="propeo_user.mailer.factory" method="createTwigSwiftMailer" />
<argument type="service" id="acme.mailer_name_provider" />
<argument type="service" id="router" />
<argument type="service" id="twig" />
<argument type="collection">
<argument key="template" type="collection">
<argument key="confirmation">%fos_user.registration.confirmation.template%</argument>
<argument key="resetting">%fos_user.resetting.email.template%</argument>
</argument>
</argument>
</service>
以及工廠類:
# Acme/UserBundle/Service/TwigSwiftMailerFactory
class TwigSwiftMailerFactory extends ContainerAware
{
private function getContainer()
{
if(!($this->container instanceof ContainerInterface)) {
throw new \RuntimeException('Container is missing');
}
return $this->container;
}
public function createTwigSwiftMailer(MailerNameProvider $mailerNameProvider, UrlGeneratorInterface $router, \Twig_Environment $twig, array $parameters)
{
$container = $this->getContainer();
$name = $mailerNameProvider->getMailerName(); // returns mailer name, e.g. mailer_en
$mailer = $container->get(
sprintf('swiftmailer.mailer.%s', $name ? $name : 'default')
);
$parameters['from_email']['confirmation'] =
$parameters['from_email']['resetting'] =
$container->getParameter(
sprintf('swiftmailer.mailer.%s.sender_address', $name ? $name : 'default')
)
;
return new TwigSwiftMailer($mailer, $router, $twig, $parameters);
}
}
謝謝Peter,不知道我是怎麼錯過的...... – Jonny