Shopware 6:在生产模式下更改 URL 参数 returns 相同的结果
Shopware 6: Changing URL parameters returns the same result in prod mode
我们扩展了产品列表以包含影响输出的特定参数“属性-groups”。
在dev
模式下一切正常,但是当切换到prod
模式时,更改该参数不再有任何影响。
好像是缓存了,但为什么连URL参数都变了?
即
/widgets/cms/navigation/67e6a05deae747e984a622c7e94e6881?no-aggregations=1&order=name-asc&p=1&property-groups=385b9ebbfc8e450bac9c4d63052ddf7f&slots=7b2547b253a145468fa35eb684b26a62
returns 一样
/widgets/cms/navigation/67e6a05deae747e984a622c7e94e6881?no-aggregations=1&order=name-asc&p=1&property-groups=&slots=7b2547b253a145468fa35eb684b26a62
如果我们刷新整个缓存,第二次调用会工作并且 returns 正确的结果。
我们当然不想完全禁用缓存,所以我们可能不得不告诉 Shopware 6 以某种方式使用缓存键中的新参数。
但是我们无法找到通过 \Shopware\Storefront\Controller\CmsController::category
调试发生缓存的位置。
问题好像是这样的:
\Shopware\Core\Content\Product\SalesChannel\Listing\CachedProductListingRoute::generateKey
private function generateKey(string $categoryId, Request $request, SalesChannelContext $context, Criteria $criteria): string
{
$parts = [
self::buildName($categoryId),
$this->generator->getCriteriaHash($criteria),
$this->generator->getSalesChannelContextHash($context),
];
$event = new ProductListingRouteCacheKeyEvent($parts, $categoryId, $request, $context, $criteria);
$this->dispatcher->dispatch($event);
return md5(JsonFieldSerializer::encodeJson($event->getParts()));
}
这里生成了一个缓存键,它考虑了标准参数,而不是我们添加的新参数。
您必须监听 ProductListingRouteCacheKeyEvent
并将您的参数添加到部件中。
public static function getSubscribedEvents(): array
{
return [
// ...
ProductListingRouteCacheKeyEvent::class => 'addPropertyGroupsCachePart'
];
}
public function addPropertyGroupsCachePart(ProductListingRouteCacheKeyEvent $event)
{
$event->addPart((string)$event->getRequest()->get('poperty-groups'));
}
这样 Shopware 会生成一个唯一的缓存键,该键也基于我们引入的那个参数,缓存冲突就会消失。
我们扩展了产品列表以包含影响输出的特定参数“属性-groups”。
在dev
模式下一切正常,但是当切换到prod
模式时,更改该参数不再有任何影响。
好像是缓存了,但为什么连URL参数都变了?
即
/widgets/cms/navigation/67e6a05deae747e984a622c7e94e6881?no-aggregations=1&order=name-asc&p=1&property-groups=385b9ebbfc8e450bac9c4d63052ddf7f&slots=7b2547b253a145468fa35eb684b26a62
returns 一样
/widgets/cms/navigation/67e6a05deae747e984a622c7e94e6881?no-aggregations=1&order=name-asc&p=1&property-groups=&slots=7b2547b253a145468fa35eb684b26a62
如果我们刷新整个缓存,第二次调用会工作并且 returns 正确的结果。
我们当然不想完全禁用缓存,所以我们可能不得不告诉 Shopware 6 以某种方式使用缓存键中的新参数。
但是我们无法找到通过 \Shopware\Storefront\Controller\CmsController::category
调试发生缓存的位置。
问题好像是这样的:
\Shopware\Core\Content\Product\SalesChannel\Listing\CachedProductListingRoute::generateKey
private function generateKey(string $categoryId, Request $request, SalesChannelContext $context, Criteria $criteria): string
{
$parts = [
self::buildName($categoryId),
$this->generator->getCriteriaHash($criteria),
$this->generator->getSalesChannelContextHash($context),
];
$event = new ProductListingRouteCacheKeyEvent($parts, $categoryId, $request, $context, $criteria);
$this->dispatcher->dispatch($event);
return md5(JsonFieldSerializer::encodeJson($event->getParts()));
}
这里生成了一个缓存键,它考虑了标准参数,而不是我们添加的新参数。
您必须监听 ProductListingRouteCacheKeyEvent
并将您的参数添加到部件中。
public static function getSubscribedEvents(): array
{
return [
// ...
ProductListingRouteCacheKeyEvent::class => 'addPropertyGroupsCachePart'
];
}
public function addPropertyGroupsCachePart(ProductListingRouteCacheKeyEvent $event)
{
$event->addPart((string)$event->getRequest()->get('poperty-groups'));
}
这样 Shopware 会生成一个唯一的缓存键,该键也基于我们引入的那个参数,缓存冲突就会消失。