web-dev-qa-db-ja.com

symfony2のコマンドラインからメールを送信します

Symfony2のコマンドクラスからtwigテンプレートをレンダリングする必要があります。

_namespace IT\bBundle\Command;

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

class CronCommand extends ContainerAwareCommand
{
    protected function configure()
    {
        $this
            ->setName('send:emails')
            ->setDescription('Envio programado de emails');
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $message = \Swift_Message::newInstance()
            ->setSubject('bla bla')
            ->setFrom('[email protected]')
            ->setTo('[email protected]')
            ->setCharset('UTF-8')
            ->setContentType('text/html')       
            ->setBody($this->renderView('mainBundle:Email:default.html.twig'));

        $this->getContainer()->get('mailer')->send($message);
        $output->writeln('Enviado!');
    }
}
_

しかし、コマンド_php app/console send:emails_を実行すると、次のエラーが発生します。

致命的なエラー:未定義のメソッドの呼び出しIT\bBundle\Command\CronCommand::renderView()

ビューをレンダリングするにはどうすればよいですか?

28
nasy

それはrenderViewがクラスControllerのメソッドだからです。その代わりに:

$this->getContainer()->get('templating')->render(...);
75
Cyprian

変化する

$this->renderView()

$this->getContainer()->get('templating')->render()
18

たぶん、あなたが尋ねる質問とは異なりますが、確かに-重要です。

コマンドコールでメールを送信する場合は、flushQueueを実行する必要があることを忘れないでください。

$mailer = $container->get('mailer');
$spool = $mailer->getTransport()->getSpool();
$transport = $container->get('swiftmailer.transport.real');
$spool->flushQueue($transport);
9
deyvw