Magento 2 orderFactory не найден в каталоге поставщиков - PullRequest
3 голосов
/ 16 марта 2020

Я использую Magento 2.3.4 внутри контейнера docker для расширения платежного шлюза. Прежде всего, вот этот уязвимый код:

<?php

namespace Magento\PGM\Block;

use Magento\AdminNotification\Model\Inbox;
use Magento\Checkout\Model\Session;
use Magento\Framework\App\ObjectManager;
use Magento\Framework\App\Response\Http;
use Magento\Framework\View\Element\Template;
use Magento\Framework\View\Element\Template\Context;
use Magento\Sales\Api\Data\OrderAddressInterface;
use Magento\Sales\Model\Order\Payment\Transaction;
use Magento\Sales\Model\Order\Payment\Transaction\Builder as TransactionBuilder;
use Magento\Sales\Model\OrderFactory;
use Magento\Store\Model\ScopeInterface;
use Magento\PGM\Logger\Logger;


class Main extends Template
{
    protected $_objectmanager;
    protected $checkoutSession;
    protected $urlBuilder;
    protected $response;
    protected $config;
    protected $messageManager;
    protected $transactionBuilder;
    protected $inbox;
    private $logger;
    private $orderFactory;

    public function __construct(Context $context, Session $checkoutSession, OrderFactory $orderFactory = null, Logger $logger, Http $response, TransactionBuilder $tb, Inbox $inbox)
    {
        $this->checkoutSession = $checkoutSession;
        $this->orderFactory = $orderFactory ?: ObjectManager::getInstance()->get(OrderFactory::class);
        $this->response = $response;
        $this->config = $context->getScopeConfig();
        $this->transactionBuilder = $tb;
        $this->logger = $logger;
        $this->inbox = $inbox;

        $this->urlBuilder = ObjectManager::getInstance()
            ->get('Magento\Framework\UrlInterface');
        parent::__construct($context);
    }

    public function getParentId()
    {
        return $this->getData(OrderAddressInterface::PARENT_ID);
    }

    protected function _prepareLayout()
    {
        $method_data = array();
        $order = $this->orderFactory->create()->load($this->getParentId());
        if ($order) {
            $payment = $order->getPayment();
            // The error is thrown here (" Call to a member function setTransactionId() on null")
            $payment->setTransactionId("-1");
            ...
            $payment->save();
            $order->save();

            ...
    }

    private function setApiData($order, $testmode, $instance)
    {
       ...
    }
}

Я получаю эту ошибку:

Вызов функции-члена setTransactionId () для null

Я думаю, что это всего лишь симптом. Объект заказа не создан, моя IDE помечает метод $order->getPayment() как вообще не найденный.

Сам код не должен быть проблемой, но папка 'Sales \ Model' не содержит orderFactory. php файл. Файл отсутствует или устарел? Несколько модулей используют этот файл и создают подобные заказы, например Paypal PGM , и используют файл OrderFactory. php.

Ответы [ 2 ]

1 голос
/ 17 марта 2020

Привет orderFactory не имеет платежа в БД, поэтому вы не можете использовать его для получения оплаты. Вы можете попробовать это:

use Magento\Sales\Model\ResourceModel\Order\Payment\Transaction\CollectionFactory; 
protected $transactions;
public function __constructor(CollectionFactory $transactions)
{
    $this->transactions = $transactions;
}

В вашем методе:

$transactions = $this->transactions->create()->addOrderIdFilter($orderId);
...
$transactions->setTransactionId("-1");`
1 голос
/ 16 марта 2020

Как я знаю, имя класса Factory - это имя класса Model и добавляется вместе со словом Factory. Так что для нашего примера у нас будет класс TopicFactory. Вы не должны создавать этот класс. Magento создаст это для вас. Всякий раз, когда менеджер объектов Magento встречает имя класса, оканчивающееся словом «Factory», он автоматически генерирует класс Factory в папке var / generation, если класс еще не существует. Вы увидите фабричный класс в

ROOT/generated/code/<vendor_name>/<module_name>/Model/OrderFactory.php

Итак, первым шагом вы должны go перейти в папку Generation, чтобы увидеть, существует ли класс или НЕТ.

Если его там нет, я Если у вас возникли проблемы с разрешением, magento не может сгенерировать (не может создать файл или папку) заводской класс в папке Generation.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...