我们希望在 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(),
]));
}