php - Magento 2 在下订单和重定向到购物车时出现致命错误
问题描述
“致命错误:'未捕获的类型错误:传递给 Magento\SalesRule\Observer\SalesOrderAfterPlaceObserver::execute() 的参数 1 必须是 Magento\Framework\Event\Observer 的实例,给定 null,在 /home/kerstinf/public_html/dev 中调用/vendor/magento/framework/Interception/Interceptor.php 在第 58 行并在 /home/kerstinf/public_html/dev/vendor/magento/module-sales-rule/Observer/SalesOrderAfterPlaceObserver.php:58 中定义:\n堆栈跟踪:\n #0 /home/kerstinf/public_html/dev/vendor/magento/framework/Interception/Interceptor.php(58): Magento\SalesRule\Observer\SalesOrderAfterPlaceObserver->execute(NULL)\n#1 /home/kerstinf/public_html/ dev/vendor/magento/framework/Interception/Interceptor.php(138): Magento\SalesRule\Observer\SalesOrderAfterPlaceObserver\Interceptor->___callParent('execute',数组)\n#2 /home/kerstinf/public_html/dev/vendor/magento/framework/Interception/Interceptor.php(153): Magento\SalesRule\Observer\SalesOrderAfterPlaceObserver\Interceptor->Magento\Framework\Interception\{closure} (对象(Magento\Framework\Event\Observer))'在 '/home/kerstinf/public_html/dev/vendor/magento/module-sales-rule/Observer/SalesOrderAfterPlaceObserver.php' 第 58 行"
我将参数传递给 SalesOrderAfterPlaceObserver 类方法,但它仍然给我错误
我的 SalesOrderAfterPlaceObserver 类是
<?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\RuleFactory
*/
protected $_ruleCustomerFactory;
/**
* @var \Magento\SalesRule\Model\Coupon
*/
protected $_coupon;
protected $_observer;
/**
* @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\Framework\Event\Observer $observer,
\Magento\SalesRule\Model\RuleFactory $ruleFactory,
\Magento\SalesRule\Model\Rule\CustomerFactory $ruleCustomerFactory,
\Magento\SalesRule\Model\Coupon $coupon,
\Magento\SalesRule\Model\ResourceModel\Coupon\Usage $couponUsage
) {
$this->_observer = $observer;
$this->_ruleFactory = $ruleFactory;
$this->_ruleCustomerFactory = $ruleCustomerFactory;
$this->_coupon = $coupon;
$this->_couponUsage = $couponUsage;
}
/**
* @param EventObserver $observer
* @return $this
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/
public function execute(Observer $observer)
{
$observer = $this->_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;
}
}
我无法在 google 和 stackoverflow 上找到解决此问题的方法。
解决方案
您注入了构造函数。请尝试运行此命令,如果您仍然面临的问题意味着清除var/di
文件夹并再次重新运行相同的命令。我希望这对你有帮助
php bin/magento setup:di:compile
推荐阅读
- airflow - 很长的时间来安排气流中的下游任务
- laravel - SQLSTATE[42000]:语法错误或访问冲突:1071 指定的键太长;最大密钥长度为 1000 字节
- angular - Angular Mat-table,是否可以单独更新单元格?
- ios - iOS 中某些用户的 Firebase PhoneAuth 错误
- python - 我安装了 Pillow,但如何使用它?
- mysql - 如何以正确或正确的方式格式化 MySQL
- ruby-on-rails - 错误请求错误 - 设置 Heroku 以使用 SendGrid 和 Rails 6 接收传入电子邮件
- css - 如何在 Tailwind CSS 中使用 CSS 变量
- gradle - gradle init - 没有按照入门教程所说的去做
- mysql - Express / MYSQL 请求加入用户和消息