如何在Symfony 5中的命令内部渲染Twig视图

本文概述

  • A.使用项目的环境
  • B.使用隔离的环境
Twig无疑是当今可以找到的PHP最佳模板引擎之一。它包含在Symfony 5的标准环境中, 并且可以在任何地方使用, 但是在官方文档中很难找到一个有用的示例, 说明如何在控制器外部(尤其是在命令内部)使用模板引擎。创建命令的特定目的是运行占用大量内存的任务, 这些任务不应通过浏览器上的请求运行, 例如, 大量电子邮件发件人服务。
命令内的模板引擎最典型的用法是动态显示电子邮件模板。在本文中, 我们将向你解释如何在symfony命令中请求模板引擎服务或如何在隔离的Twig环境中工作。
A.使用项目的环境默认情况下, 你可能希望坚持使用项目中经过常规配置的Twig环境, 因此可以在视图中访问路由方法({{path(” some_route” )}})和app变量。与隔离环境的选项相比, 这也是最简单的方法, 你只需导入Twig \ Environment命名空间并将类注入构造函数中, 即可通过私有变量将其暴露给类。然后, 你将能够从类中的$ this-> twig变量调用render方法, 如以下示例所示:
< ?php// src/Command/MyCommand.phpnamespace App\Command; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; // Import the Twig Environmentuse Twig\Environment; class MyCommand extends Command{// the name of the command (the part after "bin/console")protected static $defaultName = 'app:my-command'; // Create a private variable to store the twig environmentprivate $twig; public function __construct(Environment $twig){// Inject it in the constructor and update the value on the class$this-> twig = $twig; parent::__construct(); }protected function configure(){}protected function execute(InputInterface $input, OutputInterface $output){// Render some template inside the project/templates/emails/example.html.twig$html = $this-> twig-> render('emails/example.html.twig', ['someVariable' => 123]); // Preview HTML in the terminal$output-> writeln($html); return 0; }}

B.使用隔离的环境现在, 如果你想使用全新的Twig环境, 则需要执行一些额外的步骤。如上所述, 你需要考虑使用此选项就像使用Twig环境, 该环境与项目本身无关, 因为你无法访问路由等。首先, 创建一个服务Twig将加载项目的根目录:
< ?php// src/Service/Twig.phpnamespace App\Service; use Symfony\Component\HttpKernel\KernelInterface; use Twig\Environment; use Twig\Loader\FilesystemLoader; class Twig extends Environment {public function __construct(KernelInterface $kernel) {$loader = new FilesystemLoader("templates", $kernel-> getProjectDir()); parent::__construct($loader); }}

然后, 我们将通过构造函数将该服务注入命令中, 与第一个选项不同, 与其直接从树枝环境中渲染模板, 不如直接加载模板, 然后调用render方法, 首先直接提供参数参数(如果有):
< ?php// src/Command/MyCommand.phpnamespace App\Command; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; // Import the Twig Environment from the created serviceuse App\Service\Twig; class MyCommand extends Command{// the name of the command (the part after "bin/console")protected static $defaultName = 'app:my-command'; // Create a private variable to store the twig environmentprivate $twig; public function __construct(Twig $twig){// Inject it in the constructor and update the value on the class$this-> twig = $twig; parent::__construct(); }protected function configure(){}protected function execute(InputInterface $input, OutputInterface $output){// Load Twig File$template = $this-> twig-> load('emails/example.html.twig'); // Render HTML$html = $template-> render(['someVariable' => 123]); // Preview HTML in the terminal$output-> writeln($html); return 0; }}

【如何在Symfony 5中的命令内部渲染Twig视图】编码愉快??!

    推荐阅读