Latte模板中变量默认HTML转义,用{!$html}或|noescape可绕过但需防XSS;Nette Presenter通过$this->template赋值并render()渲染,路径自动推导;复用代码用{include}或{control}控件;缓存失效多因路径权限或命名不规范。

Latte 模板里怎么传变量并安全输出
直接用 {$name} 就能输出变量,但默认是 HTML 转义的——这是 Latte 的默认保护机制,不是 bug。如果你传的是 $html = '<strong>OK</strong>',写 {$html} 会原样显示标签,不会加粗。
要让 HTML 生效,得显式声明:用 {$html|noescape} 或简写 {!$html}。但别滥用,尤其用户输入的内容绝不能加 |noescape,否则 XSS 风险立刻出现。
- 模板中所有
{$xxx}默认走|escape过滤(等价于|htmlspecialchars) -
{if $user->isAdmin}这类逻辑判断里的变量不触发转义,只用于条件,不输出 - 数组字段访问支持链式写法:
{$user->profile->avatarUrl},空值时自动返回空字符串,不报 Notice
在 PHP 控制器里怎么渲染 Latte 模板
Nette 的 Presenter 类自带 template 属性,它不是普通数组,而是一个 Template 实例,赋值即绑定,调用 render() 即触发渲染。
常见错误是手动 new Template 或试图用 include 加载 .latte 文件——这绕过了 Nette 的路径解析、缓存和上下文注入,{$basePath} 等全局变量会失效,{snippet} 也无法工作。
立即学习“PHP免费学习笔记(深入)”;
- 正确写法:
$this->template->title = 'Dashboard'; $this->template->items = $data; $this->template->render(); - 模板路径由 Presenter 名称自动推导:
DashboardPresenter默认找@app/presenters/templates/Dashboard/default.latte - 想换模板?用
$this->template->setFile(__DIR__ . '/my.latte');,但仅限调试,生产环境建议遵守约定路径
怎么在 Latte 里复用代码块(类似 include / component)
Latte 不鼓励拼接字符串式 include,而是用 {include} + {define} + {import} 构建可组合结构。最常用的是 {include 'snippet.latte'},它会继承当前作用域变量,无需额外传参。
但如果组件需要明确接口,就该用 {control myControl} ——这是 Nette 特有的控件机制,背后是 PHP 类实例,能封装状态、验证、重绘逻辑,比纯模板包含更健壮。
-
{include 'form.latte' name=$name errors=$errors}:显式传参,子模板只能访问列出的变量 -
{define #header} <h1>{$title}</h1> {/define}配合{include #header}可局部复用片段 - 自定义控件必须注册:在 Presenter 中调用
$this['myForm']->setParameters(['method' => 'POST']);,模板里才可用{control myForm}
Latte 编译缓存失效或报错找不到模板
典型现象是改了 .latte 文件但页面没更新,或者抛出 Template not found 错误。根本原因通常是缓存路径不可写,或模板路径大小写/下划线与 Presenter 类名不匹配(Nette 默认按 PascalCase 映射目录结构)。
Latte 编译后的 PHP 文件存在 temp/cache/latte/ 下,如果这个目录权限不对,或被 gitignore 忽略导致清空后无法重建,就会卡在“找不到模板”阶段——实际是编译失败后退回到查找原始 .latte,而原始路径又错了。
- 检查
$config->services->latte->tempDirectory是否指向可写的绝对路径 - Presenter 类名含下划线(如
User_adminPresenter)会导致模板路径变成user_admin目录,但 Nette 默认按驼峰拆分,建议统一用UserAdminPresenter - 开发时可临时关闭缓存:
$latte->setTempDirectory(false);,但仅限本地,别上生产
Latte 的“零配置”表象下藏着不少路径和命名约定,一旦跨平台(比如 Windows 开发、Linux 部署)或团队命名风格不一致,第一个报错往往不是语法问题,而是文件找不到——这时候别急着查语法,先盯住路径和大小写。



















