yii 2.0 和 yii 3 均不内置模板引擎切换机制,需通过扩展集成 twig;yii 2 应使用 yii2-twig 扩展并正确配置 view 组件,yii 3 则依托 di 容器注册 twigrenderer,二者均需注意路径、csrf、asset 等适配。

Yii 2.0 和 Yii 3 并不内置统一的“模板引擎切换”机制——它们默认都用 PHP 原生语法写视图(.php 文件),但支持通过扩展集成 Twig、Smarty 等第三方模板引擎。所谓“切换不报错”,核心不是框架自带开关,而是正确卸载旧渲染逻辑、注册新引擎、适配生命周期钩子。关键在配置和初始化时机,而非简单改个配置项。
Yii 2.0 中集成 Twig(替代原生 PHP 视图)
-
不要直接替换
view组件类名:Yii 2.0 的yii\web\View是强耦合的,硬换成TwigView会断掉 layout 渲染、asset 注入、CSRF 隐藏字段等。 - 正确做法是用
yii2-twig扩展(如yiisoft/yii2-twig官方包):- 安装:
composer require yiisoft/yii2-twig - 配置
components中的view:'view' => [ 'class' => 'yii\twig\View', 'twigOptions' => [ 'auto_reload' => YII_DEBUG, 'cache' => '@runtime/Twig/cache', ], 'renderers' => [ 'twig' => [ 'class' => 'yii\twig\ViewRenderer', 'cachePath' => '@runtime/Twig/cache', ], ], ], - 视图文件后缀改为
.twig,控制器中调用return $this->render('index.twig', $data); - 注意:
layout、block、registerJs/Css等仍需通过ViewRenderer透传,不能直接在 Twig 模板里调Yii::$app->view->registerJs()。
- 安装:
Yii 3 中使用 Twig(更干净,因 DI 容器解耦)
- Yii 3 默认不绑定任何模板引擎,由开发者按需组合。
- 推荐用
yiisoft/view-twig包:- 安装:
composer require yiisoft/view-twig - 在
config/common/web.php或config/test/web.php中注册:return [ 'services' => [ Yiisoft\View\WebView::class => [ '__class' => Yiisoft\View\WebView::class, '__construct()' => [ 'renderer' => Reference::to(TwigRenderer::class), ], ], TwigRenderer::class => [ '__class' => Yiisoft\View\Twig\TwigRenderer::class, '__construct()' => [ 'environment' => Reference::to(\Twig\Environment::class), ], ], \Twig\Environment::class => [ '__class' => \Twig\Environment::class, '__construct()' => [ 'loader' => Reference::to(\Twig\Loader\FilesystemLoader::class), 'options' => ['debug' => YII_DEBUG, 'cache' => '@runtime/twig'], ], ], \Twig\Loader\FilesystemLoader::class => [ '__class' => \Twig\Loader\FilesystemLoader::class, '__construct()' => ['@views'], ], ], ]; - 控制器返回
new Response($this->view->render('site/index', $params));即可,render()自动识别.twig后缀。 - Twig 函数如
csrf()、url()需手动注册为 Twig 全局函数(通过addGlobal或扩展TwigExtension)。
- 安装:
切换时常见报错及避坑点
-
Class not found:没执行
composer dump-autoload,或命名空间拼错(Yii 2 用yii\twig\*,Yii 3 用Yiisoft\View\Twig\*) -
Template not found:Twig loader 路径未指向真实视图目录(Yii 2 默认
@app/views,Yii 3 默认@views,注意别漏@别名解析) -
CSRF token missing:Twig 模板里没调
{% if csrfParam %}<input type="hidden" name="{{ csrfParam }}" value="{{ csrfToken }}">{% endif %},且没把csrfParam/csrfToken传入上下文 -
Asset 不注入:Twig 渲染器默认不自动执行
getView()->registerAssetBundle(),需在 layout 中显式调用{{ app.view.registeredAssets|raw }}(Yii 2)或提前在控制器中触发 asset 注册(Yii 3)
不复杂但容易忽略











