如何在树枝中获取当前会话数组计数?

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)

添加到会话中可以正常工作,并且上面的打印调试显示它是准确的,但是在顶部导航栏徽标中,我总是得到以前的项目数量而不是当前数量,除非我刷新页面以显示当前内容。如何解决?

Arl*_*Hix 5

无需设置全局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()来代替lengthreduce

{{ 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)