个性化阅读
专注于IT技术分析

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

本文概述

Twig无疑是当今可以找到的PHP最佳模板引擎之一。它包含在Symfony 5的标准环境中, 并且可以在任何地方使用, 但是在官方文档中很难找到一个有用的示例, 说明如何在控制器外部(尤其是在命令内部)使用模板引擎。创建命令的特定目的是运行占用大量内存的任务, 这些任务不应通过浏览器上的请求运行, 例如, 大量电子邮件发件人服务。

命令内的模板引擎最典型的用法是动态显示电子邮件模板。在本文中, 我们将向你解释如何在symfony命令中请求模板引擎服务或如何在隔离的Twig环境中工作。

A.使用项目的环境

默认情况下, 你可能希望坚持使用项目中经过常规配置的Twig环境, 因此可以在视图中访问路由方法({{path(” some_route”)}})和app变量。与隔离环境的选项相比, 这也是最简单的方法, 你只需导入Twig \ Environment命名空间并将类注入构造函数中, 即可通过私有变量将其暴露给类。然后, 你将能够从类中的$ this-> twig变量调用render方法, 如以下示例所示:

<?php

// src/Command/MyCommand.php
namespace App\Command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

// Import the Twig Environment
use 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 environment
    private $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.php
namespace 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.php
namespace 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 service
use 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 environment
    private $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;
    }
}

编码愉快❤️!

赞(0)
未经允许不得转载:srcmini » 如何在Symfony 5中的命令内部渲染Twig视图

评论 抢沙发

评论前必须登录!