首页 > 解决方案 > 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 上找到解决此问题的方法。

标签: phpmagento2

解决方案


您注入了构造函数。请尝试运行此命令,如果您仍然面临的问题意味着清除var/di 文件夹并再次重新运行相同的命令。我希望这对你有帮助

php bin/magento setup:di:compile

推荐阅读