You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Twig的include中使用动态变量?

解决Twig Include动态传递变量的问题

这其实是Twig里非常常见的场景,完全不需要创建多个模板文件,利用include标签的with参数就能轻松实现动态传参。我给你一步步拆解具体实现方式:

1. PHP端准备数据

首先你需要从数据库查询到所有产品数据,整理成数组(或对象),然后传递给home.twig模板:

// 假设用PDO查询数据库,获取产品列表
$products = $db->query("SELECT id, name AS product_name, price FROM products")->fetchAll(PDO::FETCH_ASSOC);

// 渲染home模板,将产品列表传入上下文
echo $twig->render('home.twig', ['products' => $products]);

2. 在home.twig中循环并动态传参

在home.twig里,你只需要遍历产品列表,每次include product.twig时,把当前循环的产品数据传递进去即可。这里有几种常用写法:

写法一:传递指定变量(明确变量名)

如果product.twig只需要特定几个变量,可以直接在with里定义:

{% for item in products %}
    {# 每次循环传递当前产品的product_name和price给product.twig #}
    {% include 'product.twig' with {
        'product_name': item.product_name,
        'price': item.price
    } only %}
{% endfor %}

这里的only关键字很重要:它会让product.twig只拿到你传递的变量,不会继承home.twig里的其他上下文变量,避免变量污染或意外冲突。

写法二:传递整个产品对象/数组

如果product.twig需要用到产品的多个字段,直接传递整个产品项更高效:

{% for product in products %}
    {# 把当前循环的product对象直接传给子模板 #}
    {% include 'product.twig' with { 'product': product } only %}
{% endfor %}

写法三:简洁传递上下文(合并变量)

如果你想让product.twig直接使用当前循环项的字段名(比如product_name直接可用),可以用更简洁的写法:

{% for product in products %}
    {# 把product的所有字段作为顶层变量传入子模板 #}
    {% include 'product.twig' with product only %}
{% endfor %}

3. 在product.twig中使用变量

根据你上面的传递方式,product.twig里的变量使用对应调整:

  • 如果是写法一(指定变量):
<div class="product-item">
    <h4>{{ product_name }}</h4>
    <p>价格:{{ price }}元</p>
</div>
  • 如果是写法二(传递整个product):
<div class="product-item">
    <h4>{{ product.product_name }}</h4>
    <p>价格:{{ product.price }}元</p>
</div>
  • 如果是写法三(直接传递字段):
<div class="product-item">
    <h4>{{ product_name }}</h4>
    <p>价格:{{ price }}元</p>
</div>

这样不管你循环多少条数据库结果,都只需要一个product.twig模板,每次渲染都会自动使用当前循环的动态数据。

内容的提问来源于stack exchange,提问作者William Alvares

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:58:40