4

我们希望在 Shopware 6 的产品详细信息页面上显示客户(实际上是客户组)特定信息。

似乎有 HTTP 缓存,如果特定客户组显示页面,我们担心页面会被缓存,并且信息会泄露给非客户。

这个假设正确吗?

该文档没有透露太多关于此的信息。

有没有办法设置特定的缓存标签,使信息只显示给正确的客户群?

还是我们需要通过 AJAX 动态获取数据?

额外问题:可以在自动测试中模拟 HTTP 缓存以确保功能正常工作吗?

到目前为止我发现了什么:

  • 控制器的is注解@httpCache,似乎控制了一个页面是否被缓存

  • 缓存键是在 中生成的\Shopware\Storefront\Framework\Cache\HttpCacheKeyGenerator::generate。它考虑了完整的请求 URI,以及一些cacheHash被注入的。我相信它不会考虑到客户群

  • 也许这种generate()方法可以修饰,但我不确定这是否是正确的方法。

  • 设置了sw-cache-hash一个影响缓存的 cookie。它考虑到客户。

  • sw-cache-hash在这里创建:

      if ($context->getCustomer() || $cart->getLineItems()->count() > 0) {
          $cookie = Cookie::create(self::CONTEXT_CACHE_COOKIE, $this->buildCacheHash($context));
          $cookie->setSecureDefault($request->isSecure());
    
          $response->headers->setCookie($cookie);
      } else {
          $response->headers->removeCookie(self::CONTEXT_CACHE_COOKIE);
          $response->headers->clearCookie(self::CONTEXT_CACHE_COOKIE);
      }
    

因此,一旦您登录购物车中有一些物品,就会使用不同的缓存哈希。这取决于以下内容,但不取决于它自己的客户群:

private function buildCacheHash(SalesChannelContext $context): string
{
    return md5(json_encode([
        $context->getRuleIds(),
        $context->getContext()->getVersionId(),
        $context->getCurrency()->getId(),
    ]));
}
4

2 回答 2

2

此外,还有 , 的概念cache-invalidation states,它描述了何时不应使用缓存。

您可以在 shopware.yaml 配置文件中将其配置为整个 http-cache 或在 store-api 路由的路由级别。

从平台内的默认配置:

shopware:
   cache:
      invalidation:
            http_cache: ['logged-in', 'cart-filled']
            product_listing_route: []

如您所见,默认情况下,如果用户登录或购物车中有东西,则不会使用 http-cache。

于 2022-01-28T10:57:27.447 回答
1

正如您在最后一个代码片段中看到的,它考虑了活动规则 ID。这意味着,如果您创建的规则(通过设置 > 规则生成器)在某个组上处于活动状态,但在另一个组上无效或没有组,则会将其考虑在内并为不同的客户组创建不同的缓存哈希。

于 2022-01-28T10:51:58.563 回答