【问题标题】:Display customer specific information on product detail page - what about the caching?在产品详细信息页面上显示客户特定信息 - 缓存呢?
【发布时间】:2022-01-28 18:57:27
【问题描述】:

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

好像有HTTP缓存,如果特定客户群显示页面,我们担心页面会被缓存,信息会泄露给非客户。

这个假设正确吗?

The documentation 没有透露太多这方面的信息。

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

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

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

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

  • controller的is注解@httpCache,好像控制一个页面是否缓存

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

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

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

  • sw-cache-hash 被创建 here:

      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(),
    ]));
}

【问题讨论】:

    标签: shopware page-caching shopware6


    【解决方案1】:

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

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

    来自平台内部的默认配置:

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

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

    【讨论】:

    • 啊,好吧,所以我们可能不需要对此做任何事情,只要我们不想为登录用户使用 http 缓存。
    【解决方案2】:

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

    【讨论】:

    • 很酷 - 谢谢。我们正在考虑在我们的插件中使客户组可配置,但看起来我们应该创建一个规则并以某种方式为其分配一个操作,例如“特殊信息可见”。我猜这样缓存问题会自行解决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多