Composer require仅安装模板引擎代码,不配置加载逻辑、路径和实例化;Smarty 3.x需手动require_once加载主类,Twig需手动初始化Environment并设模板/缓存目录,Hyperf/view-engine仅为抽象层,须额外安装具体引擎。

直接用 composer require 装不上就能用的“模板引擎”——它只装代码,不配加载逻辑,不设路径,不初始化实例。你得自己补上这三步,否则必报 Class not found 或 Unable to load template。
为什么 composer require smarty/smarty 后 new Smarty() 还报错
Smarty 3.x 的官方包 smarty/smarty:3.1.* 没有 PSR-4 声明,Composer 不会自动加载它的类。它依赖传统 require_once 引入 libs/Smarty.class.php。
- 必须手动加:
require_once __DIR__ . '/vendor/smarty/smarty/libs/Smarty.class.php'; - 不能写
use Smarty;—— 它不是命名空间类 - 别在
autoload.files里硬写路径,vendor位置可能随部署环境变化 - 确认装的是 3.1.49(最后一个稳定版):运行
composer show smarty/smarty查版本
composer require twig/twig 之后为什么还要手动 new Twig\Environment
Twig 包只提供类库和自动加载,不负责创建运行环境。它不预设模板目录、缓存路径或是否开启 auto_reload —— 这些都得你显式传参。
- 必须初始化
\Twig\Loader\FilesystemLoader,指定templates/目录 - 必须传
['cache' => 'cache/', 'auto_reload' => false]才适合静态页生成 - 如果漏了
cache目录且不可写,会静默失败或抛出Twig\Error\LoaderError - 别省略命名空间:
new \Twig\Environment($loader, [...]),不是new Twig()
Hyperf 项目里 composer require hyperf/view-engine 是装什么
这不是装“一个模板引擎”,而是装视图引擎的抽象层 + 适配器桥接能力。它本身不带 Twig 或 Smarty 实现,只定义接口和基础调度逻辑。
- 要真正渲染 Smarty 模板,你还得额外
composer require smarty/smarty和hyperf/view - 若只装
hyperf/view-engine,RenderInterface会注入失败,控制器调$render->render('x.tpl', [...])直接报NotFoundException - 它允许你按需替换引擎:比如卸载 Smarty、装
twig/twig,再注册TwigEngine,无需改框架核心 - 注意版本对齐:
hyperf/view-engine ^3.0对应 Hyperf v3.x,不兼容 v2.x
最常被跳过的动作是:没检查模板目录是否存在且可写、没确认 vendor/autoload.php 是否已引入、把命名空间类当全局类用(比如 new Smarty() 在 Smarty 4 下永远失败)。这些地方一错,错误信息往往不指向根源,而是卡在“找不到类”或“无法加载模板”。











