Magento 2下单触发致命错误跳转回购物车问题求助
问题根源与解决方案
这个致命错误的核心原因是你错误地在观察者的构造函数中注入了\Magento\Framework\Event\Observer实例,这完全违背了Magento 2观察者的工作机制:
Magento 2中,Observer对象是在事件触发时由框架动态创建并直接传递给execute()方法的,它不属于可以通过依赖注入容器提供的服务。你在构造函数里添加这个依赖后,DI容器无法正确解析并提供有效的Observer实例,最终导致调用execute()时传入了null,触发类型错误。
修复步骤
- 移除错误的依赖注入:删掉构造函数中的
\Magento\Framework\Event\Observer参数,以及对应的$_observer属性定义。 - 恢复
execute()方法的正确逻辑:直接使用方法参数传入的$observer对象,不要用构造函数中存储的无效实例覆盖它。
修复后的完整代码
<?php /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ namespace Magento\SalesRule\Observer; use Magento\Framework\Event\Observer; use Magento\Framework\Event\ObserverInterface; class SalesOrderAfterPlaceObserver implements ObserverInterface { /** * @var \Magento\SalesRule\Model\RuleFactory */ protected $_ruleFactory; /** * @var \Magento\SalesRule\Model\Rule\CustomerFactory */ protected $_ruleCustomerFactory; /** * @var \Magento\SalesRule\Model\Coupon */ protected $_coupon; /** * @var \Magento\SalesRule\Model\ResourceModel\Coupon\Usage */ protected $_couponUsage; /** * @param \Magento\SalesRule\Model\RuleFactory $ruleFactory * @param \Magento\SalesRule\Model\Rule\CustomerFactory $ruleCustomerFactory * @param \Magento\SalesRule\Model\Coupon $coupon * @param \Magento\SalesRule\Model\ResourceModel\Coupon\Usage $couponUsage */ public function __construct( \Magento\SalesRule\Model\RuleFactory $ruleFactory, \Magento\SalesRule\Model\Rule\CustomerFactory $ruleCustomerFactory, \Magento\SalesRule\Model\Coupon $coupon, \Magento\SalesRule\Model\ResourceModel\Coupon\Usage $couponUsage ) { $this->_ruleFactory = $ruleFactory; $this->_ruleCustomerFactory = $ruleCustomerFactory; $this->_coupon = $coupon; $this->_couponUsage = $couponUsage; } /** * @param Observer $observer * @return $this * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ public function execute(Observer $observer) { $order = $observer->getEvent()->getOrder(); if (!$order || !$order->getAppliedRuleIds()) { return $this; } // lookup rule ids $ruleIds = explode(',', $order->getAppliedRuleIds()); $ruleIds = array_unique($ruleIds); $ruleCustomer = null; $customerId = $order->getCustomerId(); // use each rule (and apply to customer, if applicable) foreach ($ruleIds as $ruleId) { if (!$ruleId) { continue; } /** @var \Magento\SalesRule\Model\Rule $rule */ $rule = $this->_ruleFactory->create(); $rule->load($ruleId); if ($rule->getId()) { $rule->loadCouponCode(); $rule->setTimesUsed($rule->getTimesUsed() + 1); $rule->save(); if ($customerId) { /** @var \Magento\SalesRule\Model\Rule\Customer $ruleCustomer */ $ruleCustomer = $this->_ruleCustomerFactory->create(); $ruleCustomer->loadByCustomerRule($customerId, $ruleId); if ($ruleCustomer->getId()) { $ruleCustomer->setTimesUsed($ruleCustomer->getTimesUsed() + 1); } else { $ruleCustomer->setCustomerId($customerId)->setRuleId($ruleId)->setTimesUsed(1); } $ruleCustomer->save(); } } } $this->_coupon->load($order->getCouponCode(), 'code'); if ($this->_coupon->getId()) { $this->_coupon->setTimesUsed($this->_coupon->getTimesUsed() + 1); $this->_coupon->save(); if ($customerId) { $this->_couponUsage->updateCustomerCouponTimesUsed($customerId, $this->_coupon->getId()); } } return $this; } }
后续操作
修复代码后,执行以下命令刷新缓存并重新生成代码:
bin/magento cache:clean bin/magento cache:flush bin/magento setup:di:compile
完成后测试下单流程,应该就能解决跳转回购物车的致命错误问题了。
内容的提问来源于stack exchange,提问作者Hassaan
相关产品推荐
相关产品推荐

