<p>Symfony默认使用Twig模板引擎,通过{{ }}输出变量、{% %}控制逻辑、{# #}注释,支持自动转义防XSS、模板继承、过滤器链式调用及asset/path等内置函数。</p>

Symfony 默认使用 Twig 作为模板引擎,写模板不是写 PHP 脚本,而是用清晰、安全、可继承的标记语言组织 HTML 结构和动态内容。核心是把逻辑控制和数据展示分离开,让前端更专注结构,后端专注数据。
变量输出与基础语法
Twig 模板里所有动态内容都通过 {{ }} 输出,系统默认开启 HTML 自动转义,防止 XSS 攻击。比如:
-
{{ user.name }}—— 输出用户姓名,若含<script>会被转义成纯文本 -
{{ post.title|upper|trim }}—— 链式调用过滤器:先转大写,再去除首尾空格 -
{{ items|length }}—— 使用内置过滤器获取数组长度 -
{{ now|date('Y-m-d') }}—— 格式化当前时间(now是 Twig 内置变量)
条件判断与循环结构
用 {% %} 包裹控制逻辑,不输出内容,只执行判断或遍历:
{% if user.isVerified %}已认证{% else %}未认证{% endif %}{% for product in products %}<li>{{ product.name }}</li>{% endfor %}-
{% for key, value in config %}{{ key }}: {{ value }}{% endfor %}—— 遍历关联数组 -
{% if users|length > 0 %}...{% else %}暂无用户{% endif %}—— 结合过滤器做判断
模板继承与区块复用
这是 Symfony/Twig 最实用的设计模式,避免重复写 head、nav、footer:
- 母版页(如
base.html.twig)定义{% block title %}{% endblock %}和{% block body %}{% endblock %} - 子模板开头写
{% extends 'base.html.twig' %} - 然后用
{% block body %}...{% endblock %}填充对应区域 - 支持多层继承,也支持
{{ parent() }}在子块中调用父块内容
引入资源与常用函数
Symfony 环境下,静态资源和路由链接不能硬编码,要靠 Twig 函数生成:
-
{{ asset('css/app.css') }}—— 输出带版本号或 CDN 前缀的 CSS 路径(依赖配置) -
{{ path('app_home') }}—— 生成命名路由的相对路径(如/) -
{{ url('app_api_users') }}—— 生成绝对 URL(含域名) -
{{ include('components/_header.html.twig') }}—— 同步引入局部模板 -
{{ render(controller('App\Controller\SidebarController::index')) }}—— 异步渲染控制器返回内容(ESI 或 Subrequest)


















