在产品详细信息页面上显示客户特定信息 - 缓存如何?
Display customer specific information on product detail page - what about the caching?
我们想在 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(),
]));
}
如您在最后一个代码片段中所见,它考虑了活动规则 ID。
这意味着,如果您创建一个规则(通过设置 > 规则生成器),该规则在某个组上处于活动状态,但在另一个组或没有组上处于活动状态,它将被考虑并为不同的客户组创建不同的缓存哈希。
此外还有 cache-invalidation states
的概念,描述了何时不应使用缓存。
您可以在 shopware.yaml 配置文件中为 http-cache 作为一个整体或在路由级别为 store-api 路由进行配置。
来自平台内的默认配置:
shopware:
cache:
invalidation:
http_cache: ['logged-in', 'cart-filled']
product_listing_route: []
如您所见,默认情况下 http-cache 不会在用户登录或购物车中有商品时使用。
我们想在 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(),
]));
}
如您在最后一个代码片段中所见,它考虑了活动规则 ID。 这意味着,如果您创建一个规则(通过设置 > 规则生成器),该规则在某个组上处于活动状态,但在另一个组或没有组上处于活动状态,它将被考虑并为不同的客户组创建不同的缓存哈希。
此外还有 cache-invalidation states
的概念,描述了何时不应使用缓存。
您可以在 shopware.yaml 配置文件中为 http-cache 作为一个整体或在路由级别为 store-api 路由进行配置。
来自平台内的默认配置:
shopware:
cache:
invalidation:
http_cache: ['logged-in', 'cart-filled']
product_listing_route: []
如您所见,默认情况下 http-cache 不会在用户登录或购物车中有商品时使用。