如何在Twig模板中展示控制器统计的购物车商品总数量?
购物车商品总数量展示实现
问题说明
需在顶部导航栏展示购物车的商品总数量,目前已编写对应路由但无法将计算得到的数值正确渲染到模板中。
现有代码
控制器部分
/** * @Route("/count/{qtt}", name="count_panier") */ public function testAction($qtt, Request $req) { $qtt = $this->afficherCount($req); return $this->redirectToRoute('mag', ['count' => $qtt]); } //---------------------------------------------- public function afficherCount(Request $req) { $sess = $req->getSession(); $panier = $sess->get('panier', []); $qtt = 0; foreach ($panier as $item) { $qtt += $item->quantiteCommandee; } return $qtt; }
Twig导航栏部分
<div class="menu"> <a class="active" href="{{ path('mag') }}">Catalogue</a> <a href="contact">Contact</a> <a href="#creeCompte">Crée un compte</a> <a href="#connexion">Connexion</a> <a href="panier">Panier <img width="30" alt="img" src="{{ asset('images/cart.png') }}"></a> <span id='panierCompteur'> <a href="{{ path('count_panier', {'qtt': 0}) }}"></a> items </span> </div>
现有实现存在的问题
- 逻辑错位:
count_panier路由设计为触发后重定向回商品目录页,属于跳转交互逻辑,无法满足页面加载时自动展示数量的需求 - 冗余代码:路由定义的
{qtt}路径参数在方法内部被重新计算的值直接覆盖,全程未被实际使用 - 渲染缺失:导航栏的计数span标签内未绑定实际的购物车总数量值,仅放置了一个空链接
正确实现方案
推荐方案:通过Twig全局变量实现全页面数量渲染
不需要依赖跳转路由,直接将购物车总数量的计算逻辑暴露给所有Twig模板复用:
- 将原
afficherCount的计算逻辑抽离为独立服务,注入Session存储对象,直接读取购物车数据计算总商品数 - 在框架配置中将该服务的计算结果注册为Twig全局变量,例如命名为
panier_total_qtt - 修改导航栏模板的计数区域,直接引用全局变量完成渲染:
<span id='panierCompteur'> {{ panier_total_qtt }} items </span> - 原有的
count_panier路由可直接删除,该路由在当前需求下无实际作用
备选方案:通过基础控制器统一传参
如果不想注册Twig全局变量,可以在项目所有页面渲染共同继承的基础控制器中,提前计算好购物车总数量,通过Twig全局参数配置传递给模板,最终模板内的渲染方式和推荐方案一致。
注意:购物车数量是用户浏览任意页面都需要展示的全局元素,必须在页面渲染阶段就完成数值计算,不能靠点击链接触发跳转来更新数量。
内容的提问来源于stack exchange,提问作者Karim
相关产品推荐
相关产品推荐

