RenderView 在 Symfony 命令中的使用
RenderView in Symfony Command usage
如何在 symfony 命令中(而不是在控制器中)使用 $this->renderView?我对函数 "renderView" 很陌生,但是我必须设置什么才能通过命令使用它?
提前致谢问候
您的命令 class 必须扩展 ContainerAwareCommand
abstract class 然后您可以:
$this->getContainer()->get('templating')->render($view, $parameters);
当涉及扩展 ContainerAwareCommand
的命令时,获取容器的正确方法是 getContainer()
与控制器快捷方式不同。
在 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
然后创建了我自己的 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);
}
}
还有一个:依赖注入,即注入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 注入容器,容器又用于检索 templating
或 twig
或您自定义命令所需的任何内容。
如何在 symfony 命令中(而不是在控制器中)使用 $this->renderView?我对函数 "renderView" 很陌生,但是我必须设置什么才能通过命令使用它?
提前致谢问候
您的命令 class 必须扩展 ContainerAwareCommand
abstract class 然后您可以:
$this->getContainer()->get('templating')->render($view, $parameters);
当涉及扩展 ContainerAwareCommand
的命令时,获取容器的正确方法是 getContainer()
与控制器快捷方式不同。
在 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
然后创建了我自己的 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);
}
}
还有一个:依赖注入,即注入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 注入容器,容器又用于检索 templating
或 twig
或您自定义命令所需的任何内容。