Symfony命令用法中的RenderView

时间:2015-06-29 11:26:19

标签: symfony render

如何在symfony命令(不在控制器内)中使用$ this-> renderView?我是关于函数“renderView”的新手,但是我需要设置什么来使用它来执行命令?

提前感谢您的问候

3 个答案:

答案 0 :(得分:24)

您的命令类必须扩展ContainerAwareCommand abstract class然后您可以执行以下操作:

$this->getContainer()->get('templating')->render($view, $parameters);

对于扩展ContainerAwareCommand的命令,获取容器的正确方法是getContainer(),与控制器快捷方式不同。

答案 1 :(得分:1)

在Symfony 4中,我无法让$this->getContainer()->get('templating')->render($view, $parameters);工作。

我为Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand设置名称空间使用并扩展了ContainerAwareCommand class EmailCommand extends ContainerAwareCommand

我抛出异常

[Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException]
      You have requested a non-existent service "templating".

对于Symfony 4,这是我提出的解决方案。

首先我安装了Twig。

composer require twig

然后创建了我自己的树枝服务。

<?php

# src/Service/Twig.php

namespace App\Service;

use Symfony\Component\HttpKernel\KernelInterface;

class Twig extends \Twig_Environment {

    public function __construct(KernelInterface $kernel) {
        $loader = new \Twig_Loader_Filesystem($kernel->getProjectDir());

        parent::__construct($loader);
    }
}

现在我的电子邮件命令看起来像这样。

<?php

# src/Command/EmailCommand.php

namespace App\Command;

use Symfony\Component\Console\Command\Command,
    Symfony\Component\Console\Input\InputInterface,
    Symfony\Component\Console\Output\OutputInterface,
    App\Service\Twig;

class EmailCommand extends Command {

    protected static $defaultName = 'mybot:email';

    private $mailer,
            $twig;

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

        parent::__construct();
    }

    protected function configure() {
        $this->setDescription('Email bot.');
    }

    protected function execute(InputInterface $input, OutputInterface $output) {

        $template = $this->twig->load('templates/email.html.twig');

        $message = (new \Swift_Message('Hello Email'))
            ->setFrom('emailbot@domain.com')
            ->setTo('someone@somewhere.com')
            ->setBody(
                $template->render(['name' => 'Fabien']),
                'text/html'
            );

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

答案 2 :(得分:0)

又一个:依赖依赖注入,即注入ContainerInterface

namespace AppBundle\Command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Psr\Container\ContainerInterface;

class SampleCommand extends Command
{
    public function __construct(ContainerInterface $container)
    {
        $this->templating = $container->get('templating');
        parent::__construct();
    }

    protected function configure()
    {
        $this->setName('app:my-command')
             ->setDescription('Do my command using render');
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $data = retrieveSomeData();
        $csv = $this->templating->render('path/to/sample.csv.twig',
                                         array('data' => $data));
        $output->write($csv);
    }

    private $templating;
}

这依赖于Symfony注入容器,而容器又用于检索templatingtwig或您自定义命令所需的任何内容。