如何在Command中使用Swift Mailer

时间:2019-07-19 09:47:26

标签: php symfony symfony-3.4

我有这个代码...

namespace AppBundle\Command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;

class NotificationCommand extends ContainerAwareCommand
{
    protected function configure()
    {
        $this->setName('app:notif');
    }

    public function execute(InputInterface $input, OutputInterface $output)
    {
        $message = \Swift_Message::newInstance()
            ->setFrom([
                'from@example.com' => 'Example'
            ])
            ->setTo('to@example.com')
            ->setSubject('Subject')
            ->setBody(
                $this->getContainer()->renderView(
                    'emails/notify.html.twig', [
                        'foo' => 'bar',
                    ]
                ),
                'text/html'
            );

        $this->getContainer()->get('mailer')->send($message);
    }
}

我收到一个错误消息

  

试图调用一个名为class的未定义方法“ renderView”   “ ContainerV5drzta \ appDevDebugProjectContainer”。

如何在Command(Symfony 3.4)中使用Swift Mailer?

1 个答案:

答案 0 :(得分:1)

您可以通过依赖注入这些服务来解决问题,这也是Symfony试图实现的目标。

public function __construct(
    EngineInterface $templating,
    \Swift_Mailer $mailer,
) {
    $this->templating = $templating;
    $this->mailer = $mailer;

    parent::__construct();
}

您现在可以在execute()中渲染模板,如下所示:

$message = (new \Swift_Message('My message'))
    ->setFrom('foo@bar.com')
    ->setTo('bar@foo.com')
    ->setBody($this->templating->render('mytemplate.html.twig'), 'text/html');

$this->mailer->send($message);

您可以在Symfony here或更普通的文章here中阅读有关依赖注入的更多信息。