Shopware 6插件:加载未关联交叉销售的ProductStream商品
我希望通过给定ID加载ProductStream数据并在前端(例如购物车下方)展示,该ProductStream未关联ProductCrossSelling,因此也未关联任何商品。我已通过仓库加载了ProductStream集合:
$criteria = new Criteria($producStreamIds); $productStreamResult = $this->productStreamRepository->search($criteria, $context); $productStreams = $productStreamResult->getEntities();现在我需要获取关联的商品列表,以便通过
cms-element-product-slider.html.twig进行展示。我找到类似问题的解决方案,建议使用Core\Content\Product\SalesChannel\CrossSelling\ProductCrossSellingRoute.php的loadByStream方法,但该方法为私有方法;其唯一公开方法load需要传入$productId参数,而我没有该参数。目前我已复制loadByStream的代码来加载商品,想询问是否有Shopware核心中的合规方法可实现该需求?
合规实现方案
Shopware 核心提供了专门用于从 ProductStream 加载商品的ProductStreamSalesChannelRoute类,这是官方推荐的合规方式,无需复制私有方法代码。
步骤说明
注入
ProductStreamSalesChannelRoute
在你的服务或控制器中通过依赖注入注入该路由类:use Shopware\Core\Content\ProductStream\SalesChannel\ProductStreamSalesChannelRoute; class YourController { public function __construct( private readonly ProductStreamSalesChannelRoute $productStreamRoute ) {} // ... 其他业务代码 }调用路由加载商品
针对已获取的ProductStream实例,调用load方法传入对应的streamId、SalesChannelContext以及必要的请求参数(如分页、排序、限制数量等):use Symfony\Component\HttpFoundation\Request; // 从已加载的集合中获取目标ProductStream $targetStream = $productStreams->first(); if ($targetStream) { // 构建请求参数,可根据需求调整 $request = new Request([ 'limit' => 8, // 控制展示的商品数量 'page' => 1, // 可选:添加排序规则,例如 'sort' => 'name'、'order' => 'ASC' ]); $result = $this->productStreamRoute->load( $targetStream->getId(), $request, $context // 传入当前的SalesChannelContext实例 ); // 获取最终的商品集合 $products = $result->getProducts(); }传递到模板渲染
将获取到的$products变量传递给cms-element-product-slider.html.twig模板,即可直接使用该组件完成商品展示。
优势说明
- 这是Shopware官方提供的公开API,自动处理销售渠道场景下的权限校验、库存过滤、价格计算等核心逻辑。
- 无需维护复制的私有方法代码,后续Shopware版本更新时可直接享受功能迭代和Bug修复。
内容的提问来源于stack exchange,提问作者Tanmar

