本文概述
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;
}
}
编码愉快❤️!
评论前必须登录!
注册