如何在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
相关产品推荐
相关产品推荐

