use*_*704 1 php session symfony twig symfony4
在实例化树枝的引导文件中,我有:
$twig->addGlobal('cart', $session->get('cart'));
Run Code Online (Sandbox Code Playgroud)
在我的树枝的顶部导航栏中,我有一个徽章来显示购物车中添加了多少物品,如下所示:
{{ cart|length }}
Run Code Online (Sandbox Code Playgroud)
和我在上面说的引导文件之后调用的主文件,我有:
if (!empty($_getvars['id'])) {
$data = $session->get('cart');
if(!isset($data[$_getvars['id']])) {
$data[$_getvars['id']] = 0;
}
$data[$_getvars['id']] += 1;
$session->set('cart', $data);
}
print_r($session->get('cart'));
Run Code Online (Sandbox Code Playgroud)
添加到会话中可以正常工作,并且上面的打印调试显示它是准确的,但是在顶部导航栏徽标中,我总是得到以前的项目数量而不是当前数量,除非我刷新页面以显示当前内容。如何解决?
无需设置全局twig var,而是直接从模板中的会话读取,如下所示:
{% set cart = app.session.get('cart') %}
{{ cart|length }}
Run Code Online (Sandbox Code Playgroud)
或者简单地:
{{ app.session.get('cart')|length }}
Run Code Online (Sandbox Code Playgroud)
这应该为您提供更新的值(在控制器操作处理完数据之后)。
但是,考虑到您的相关问题,我想您可以使用过滤器array_sum()来代替length,reduce
{{ app.session.get('cart')|reduce((carry, v) => carry + v) }}
Run Code Online (Sandbox Code Playgroud)
这将汇总购物车数组中的所有数量值(总商品数量与的唯一商品数量length)
编辑:
对于DarkBee提到的独立应用程序,您可以将会话对象添加为全局对象,而不是会话购物车值。
$twig->addGlobal('session', $session);
Run Code Online (Sandbox Code Playgroud)
然后在模板中:
{{ session.get('cart')|length }}
{# Or #}
{{ session.get('cart')|reduce((carry, v) => carry + v)}}
Run Code Online (Sandbox Code Playgroud)