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 会生成一个唯一的缓存键,该键也基于我们引入的那个参数,缓存冲突就会消失。