如何在自制Symfony风格框架的Controller中使用Twig render方法?
搞定Controller里调用Twig的小问题
嘿,不用额外下载组件啦!你已经配置好Twig能正常运行,现在核心就是让Controller能拿到Twig的实例,然后封装个render方法就行,下面一步步来:
第一步:确认Twig已经初始化好
先确保你在框架的启动文件(比如Kernel.php或者类似的入口初始化文件)里已经正确创建了Twig实例,大概是这样的:
use Twig\Environment; use Twig\Loader\FilesystemLoader; // 指定模板文件所在的目录,根据你的项目结构调整路径 $loader = new FilesystemLoader(__DIR__.'/../templates'); // 创建Twig环境,缓存和debug根据你的环境设置 $twig = new Environment($loader, [ 'cache' => __DIR__.'/../var/cache/twig', // 生产环境建议开启,开发可以先注释 'debug' => true, ]);
这部分你已经搞定的话,直接往下走~
第二步:让Controller能拿到Twig实例
因为是自己从零搭的框架,没有Symfony自带的依赖注入容器,所以推荐用构造函数注入的方式,既规范又好维护:
先写个基础Controller类
创建一个AbstractController,所有业务Controller都继承它,把Twig实例通过构造函数传进去,再封装好render方法:
// src/Controller/AbstractController.php namespace App\Controller; use Twig\Environment; use Symfony\Component\HttpFoundation\Response; // 如果要返回标准Response的话 abstract class AbstractController { protected Environment $twig; // 通过构造函数把Twig实例注入进来 public function __construct(Environment $twig) { $this->twig = $twig; } // 封装render方法,和Symfony原生的用法一样 protected function render(string $template, array $context = []): Response { // 用Twig渲染模板得到内容,再包装成Response对象 $content = $this->twig->render($template, $context); return new Response($content); } }
业务Controller直接用就行
比如你的HelloController,直接继承上面的基础类,然后就能像Symfony里那样调用render了:
// src/Controller/HelloController.php namespace App\Controller; class HelloController extends AbstractController { public function sayHi() { return $this->render('hello/hi.html.twig', [ 'name' => '小伙伴', ]); } }
最后一步:路由分发时传入Twig实例
在你的路由处理逻辑里,实例化Controller的时候,把之前初始化好的Twig实例传进去就行:
// 假设这是你的路由分发代码,根据你自己的框架逻辑调整 $twig = // 这里是你之前创建的Twig实例 $controller = new HelloController($twig); $response = $controller->sayHi(); // 最后把Response输出 $response->send();
要是嫌构造注入麻烦,还有个简单但不推荐的方式
你可以把Twig实例存成全局变量,然后在Controller里直接调用,但这种方式耦合度高,不利于后续维护和测试,还是上面的构造注入更靠谱:
// 初始化Twig后存到全局 $GLOBALS['twig'] = $twig; // Controller里直接用 public function sayHi() { return $GLOBALS['twig']->render('hello/hi.html.twig', ['name' => '小伙伴']); }
这样操作完,你就能在Controller里像用Symfony原生一样调用Twig的render方法啦,完全不用额外加组件~
内容的提问来源于stack exchange,提问作者bujashaka
相关产品推荐
相关产品推荐

