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

Twig中如何实现PHP式变量变量?子菜单代码报错求助

解决Twig中类似PHP变量变量的导航菜单问题

嘿,Mikel,你遇到的问题是Twig不支持PHP那种直接的${$slug}变量变量语法,你写的{% for slugg, itemm in {{ slug }} %}是错误的写法——Twig里循环的目标变量不需要加花括号,而且动态获取变量得用专门的方式。下面给你两种可行的解决方案:

方法一:重构数组结构(推荐)

最规范的做法是把子菜单直接嵌套到主区域数组里,这样结构更集中,维护起来也方便,完全不需要动态变量的操作:

{% set regiones = {
    patagonia: {
        title: "Patagonia",
        submenu: {
            neuquen: { title: "Neuquén"},
            rionegro: { title: "Río Negro"},
            chubut: { title: "Chubut"},
            santacruz: { title: "Santa Cruz"},
            tierradelfuego: { title: "Tierra del Fuego"}
        }
    },
    pampa: {
        title: "Pampa",
        submenu: {
            buenosaires: { title: "Buenos Aires"},
            cordoba: { title: "Córdoba"},
            lapampa: { title: "La Pampa"},
            santafe: { title: "Santa Fe"}
        }
    },
    cuyo: {
        title: "Cuyo",
        submenu: {
            mendoza: { title: "Mendoza"},
            sanjuan: { title: "San Juan"},
            sanluis: { title: "San Luis"}
        }
    },
    noreste: { title: "Noreste"},
    noroeste: { title: "Noroeste"}
} %}

<nav>
  <ul>
    {% for slug, item in regiones %}
    <li><a href="/{{ slug }}">{{ item.title }}</a>
      {# 只有当子菜单存在时才渲染 #}
      {% if item.submenu is defined %}
      <ul>
        {% for subSlug, subItem in item.submenu %}
        <li><a href="/{{ slug }}/{{ subSlug }}">{{ subItem.title }}</a></li>
        {% endfor %}
      </ul>
      {% endif %}
    </li>
    {% endfor %}
  </ul>
</nav>

这种方式的优点是逻辑清晰,所有导航数据都在一个数组里,后续修改或添加新区域/子菜单都很直观。

方法二:使用attribute()函数实现动态变量

如果你不想重构现有数组,想保留单独的子菜单变量,可以用Twig的attribute()函数结合_context变量——_context是当前模板中所有变量的集合,通过它可以动态获取以slug值命名的变量:

{% set regiones = { patagonia: { title: "Patagonia"}, pampa: { title: "Pampa"}, cuyo: { title: "Cuyo"}, noreste: { title: "Noreste"}, noroeste: { title: "Noroeste"} } %}
{% set patagonia = { neuquen: { title: "Neuquén"}, rionegro: { title: "Río Negro"}, chubut: { title: "Chubut"}, santacruz: { title: "Santa Cruz"}, tierradelfuego: { title: "Tierra del Fuego"} } %}
{% set pampa = { buenosaires: { title: "Buenos Aires"}, cordoba: { title: "Córdoba"}, lapampa: { title: "La Pampa"}, santafe: { title: "Santa Fe"} } %}
{% set cuyo = { mendoza: { title: "Mendoza"}, sanjuan: { title: "San Juan"}, sanluis: { title: "San Luis"} } %}

<nav>
  <ul>
    {% for slug, item in regiones %}
    <li><a href="/{{ slug }}">{{ item.title }}</a>
      {# 先判断对应的子菜单变量是否存在,避免报错 #}
      {% if attribute(_context, slug) is defined %}
      <ul>
        {% for slugg, itemm in attribute(_context, slug) %}
        <li><a href="/{{ slugg }}">{{ itemm.title }}</a></li>
        {% endfor %}
      </ul>
      {% endif %}
    </li>
    {% endfor %}
  </ul>
</nav>

这里关键是把你原来的{% for slugg, itemm in {{ slug }} %}改成{% for slugg, itemm in attribute(_context, slug) %},同时加上存在性判断,防止noreste和noroeste这类没有子菜单的项引发错误。

内容的提问来源于stack exchange,提问作者M. Galardi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:42:33