composer require twig/twig安装的是twig核心运行时类(如twig\environment和twig\loader\filesystemloader),纯psr-4自动加载的依赖包,不带路由、全局函数或配置文件,需手动初始化loader与environment实例并确保路径、缓存权限正确。

Composer 安装 Twig 不需要“配置模板系统”,它只是装一个 PHP 类库;所谓“配置”是你的应用代码怎么调用它,不是 Composer 的事。
composer require twig/twig 装的是什么
执行 composer require twig/twig 后,你得到的是 Twig 的核心运行时类,比如 Twig\Environment、Twig\Loader\FilesystemLoader。它不带任何自动路由、不注册全局函数、不改 php.ini、也不生成配置文件——纯纯的依赖包。
- 装的是 PSR-4 自动加载兼容的代码,
vendor/autoload.php会把它纳入加载链 - 版本建议锁死小版本(如
"twig/twig": "^3.15"),避免^3.0升到4.x导致Twig\Environment::__construct()参数签名变化 - 别装
twig/extensions(已废弃),新功能都在twig/string-extra或twig/extra-bundle(Symfony 场景)里
Twig 加载模板前必须初始化 Loader 和 Environment
很多人装完就写 $twig->render('index.html'),报错 Call to a member function render() on null——因为根本没创建实例。
-
Twig\Loader\FilesystemLoader负责找模板文件,路径必须是真实存在的目录,比如new FilesystemLoader(__DIR__ . '/templates') -
Twig\Environment才是渲染引擎,必须传入 loader 实例:new Environment($loader, ['cache' => __DIR__ . '/cache']) - 缓存目录要可写,否则开发时会静默失败(模板编译卡住),生产环境建议开
'cache' => '/var/cache/twig'而不是false
$loader = new \Twig\Loader\FilesystemLoader(__DIR__ . '/templates');
$twig = new \Twig\Environment($loader, [
'cache' => __DIR__ . '/cache',
'auto_reload' => true,
]);
echo $twig->render('home.html', ['name' => 'Alice']);
模板里用 {{ }} 渲染变量,但默认禁用 PHP 代码
Twig 默认不解析 <?php ?> 或 {{ include('file.php') }},这是安全设计,不是 bug。
立即学习“PHP免费学习笔记(深入)”;
- 想引入 PHP 逻辑?得显式启用
escaper和php标签扩展,但强烈不推荐——违背模板职责分离 -
{{ dump() }}在开发环境可用,但需手动开启:在Environment构造参数里加'debug' => true,并确保安装了symfony/var-dumper - 过滤器如
|e(等价|escape)默认启用,防止 XSS;若传入 HTML 字符串需显式写{{ html_content|raw }},但务必确认来源可信
常见报错和对应检查点
报错不是 Composer 的锅,而是运行时环境或调用姿势不对:
-
Class "Twig\Loader\FilesystemLoader" not found→ 没引入vendor/autoload.php,或 Composer 自动加载损坏(删掉vendor和composer.lock重装) -
Template "xxx.html" not found→FilesystemLoader初始化路径错了,用realpath()打印出来看是否真存在 -
Unable to create the cache directory→cache目录权限不足,Linux 下常见于 www-data 用户无写权限 -
Argument 1 passed to Twig\Environment::__construct() must be an instance of Twig\Loader\LoaderInterface→ 传了字符串或 null 给第一个参数,检查 loader 是否 new 成功
真正麻烦的从来不是装上 Twig,而是 loader 路径写错、缓存目录不可写、或者把模板变量名拼错了——这些错误不会在 composer install 时报,只会在第一次 render() 时炸出来。











