0

早上好,

我尝试阅读 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 可用应该是最好的主意?!

感谢您的时间和帮助

4

2 回答 2

3

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

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从事件中获取。

于 2020-08-28T07:25:05.623 回答
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()这里的调用。您可以在此处找到详细说明。

于 2020-08-28T07:25:43.603 回答