Magento2 checkout_onepage_controller_success_action事件获取配送地址报错如何解决
错误成因
checkout_onepage_controller_success_action事件返回的orderIds是字符串格式的订单ID数组,而非订单模型对象数组,你代码中直接取$orderIds[0]得到的是纯文本的订单ID值,不是Magento\Sales\Model\Order实例,因此无法调用getShippingAddress()这类模型方法,触发字符串调用成员方法的报错。
正确实现方案
Magento2官方推荐使用OrderRepositoryInterface服务契约根据订单ID加载完整订单模型,步骤如下:
- 先在观察者类的构造函数中注入订单仓库依赖:
<?php namespace 你的模块命名空间\Observer; use Magento\Framework\Event\Observer; use Magento\Framework\Event\ObserverInterface; use Magento\Sales\Api\OrderRepositoryInterface; class CheckoutSuccessObserver implements ObserverInterface { /** * @var OrderRepositoryInterface */ protected $orderRepository; /** * @param OrderRepositoryInterface $orderRepository */ public function __construct( OrderRepositoryInterface $orderRepository ) { $this->orderRepository = $orderRepository; } /** * @param Observer $observer * @return void */ public function execute(Observer $observer) { $event = $observer->getEvent(); $orderIds = $event->getOrderIds(); // 加载订单模型 $order = $this->orderRepository->get($orderIds[0]); // 获取配送相关信息 $shippingAddressData = $order->getShippingAddress()->getData(); $shippingMethodCode = $order->getShippingMethod(); $shippingDescription = $order->getShippingDescription(); } }
注意事项
- 调用
getShippingAddress()前可先判断$order->getIsVirtual(),虚拟订单不存在配送地址,避免调用空对象方法报错 - 该事件仅触发前台单页结账成功场景,如需覆盖后台创建订单、API创建订单等全场景,可替换使用
sales_order_place_after事件
内容的提问来源于stack exchange,提问作者rashi
相关产品推荐
相关产品推荐

