注册后 Shopware 订户中的帐单地址

Posted

技术标签:

【中文标题】注册后 Shopware 订户中的帐单地址【英文标题】:billingaddress in Shopware Subscriber after registration 【发布时间】:2020-12-17 02:06:54 【问题描述】:

早上好,

我尝试在 Shopware 6 订阅者中读取客户帐单地址已经好几个小时了。 在控制器中我可以使用:

$SalesChannelContext->getCustomer()->getActiveBillingAddress() 

但 SalesChannelContext 在 Subscribers->EntityWrittenEvent 中不可用,因此此方法不起作用。通过 services.xml 注入不起作用(因为 SCC 不是服务?) 我试图通过这样的客户实体获取客户数据:

$customerRepo = $this->container->get('customer.repository');
$criteria = (new Criteria())
              ->addFilter(new EqualsFilter('id', $id));
       
$customer = $customerRepo->search( $criteria, $context);

找到了客户,但地址(帐单和交货)为空,所以这也是错误的方式。 有没有人想办法解决这个问题?

我需要什么:获取帐单地址的方法 我得到了什么:地址=> null的客户对象 解决方法:让 saleschannelcontext 可用应该是最好的主意?!

感谢您的时间和帮助

【问题讨论】:

【参考方案1】:

您订阅了哪个活动?许多事件都有SalesChannelContext 作为属性,也许你可以从那里得到它。

SalesChannelContext 不是服务,因为它是代表当前请求状态的对象。因此,必须根据每个请求重新创建一些东西。

如果您有客户 ID,那么获取其数据非常简单,正如您已经发现的那样。您缺少的是与帐单地址的关联。默认情况下,由于性能原因,关联通常不会与主实体一起加载。但是您可以将它们添加到Criteria 对象中:

$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('id', $id));
$criteria->addAssociation('defaultBillingAddress');
// $criteria->addAssociation('activeBillingAddress'); if you want the current active address, might differ from the default one
// $criteria->addAssociation('addresses'); if you want all addresses
       
$customer = $this->customerRepo->search( $criteria, $context);

但在您使用另一个查询选择客户之前,我会尝试从事件中获取SalesChannelContext

【讨论】:

添加关联是正确的答案。谢谢。我(暂时)订阅了 EntityWrittenEvent 来测试我的代码。没有 SalesChannelContext,或者我没有通过标准方式找到。但! SalesChannelContext 可通过 $request 获得:$requestStack->getCurrentRequest()->attributes->get('sw-sales-channel-context') 两种解决方案现在都在工作。 :) 请确保您始终检查是否设置了SalesChannelContext 对象而不是null。因为 EntityWrittenEvent 当然也在其他上下文中调度,比如管理 API【参考方案2】:

salesChannelContext 不是全局可用的,因为它仅在请求来自店面时可用。例如,如果您在 Admin-API 上下文,甚至 CLI 上下文中,则没有可用的 SalesChannelContext。

一般而言,您从数据库中获取客户的解决方案看起来是正确的方法。

您遇到了问题,因为 Shopware DAL (DataAbstractionLayer) 默认情况下不加载实体的关联,您必须事先定义要与主实体加载的关联。

在您的情况下,这将通过以下方式完成:

$customerRepo = $this->container->get('customer.repository');
$criteria = (new Criteria())
              ->addFilter(new EqualsFilter('id', $id))
              ->addAssociation('defaultBillingAddress');
       
$customer = $customerRepo->search( $criteria, $context);
$customer->getDefautBillingAddress();

请注意此处的addAssociation() 呼叫。您可以找到详细说明here。

【讨论】:

感谢您的回答。那也是正确的答案,就像上面一样。在 Symfony 中,我默认获取所有集合,这对我来说是新的。谢谢。

以上是关于注册后 Shopware 订户中的帐单地址的主要内容,如果未能解决你的问题,请参考以下文章

在 Shopware 5.4 中捕获订单更改事件。*

微服务服务注册中心注册和发现

Shopware 6 Admin API 的文档。啥是可能的命令?

Oracle AQ订阅注册错误?

如何验证 Django Oscar 中的帐单地址信息?

gitee注册地址已存在咋搞