Magento 2:无法从不同的控制器获取数据

Magento 2: Cannot getData from different controller

我有这个class

class Api extends \Magento\Framework\Model\AbstractModel
{
 public function __construct(
        \Magento\Framework\Message\ManagerInterface $messageManager,
        \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
        \Magento\Store\Model\StoreManagerInterface $storeManager,
        \MyModule\Payment\Helper\Data $helper
    ) {
        $this->messageManager = $messageManager;
        $this->scopeConfig = $scopeConfig;
        $this->storeManager = $storeManager;
        $this->helper = $helper;
        $this->contentType = $this->helper->getConfigData('content_type');
    }
    .
    .
    .
    function createOnlinePurchase($authToken, $lastOrder)
    {
        .
        .
        .
        //here I pass lastOrder's increment id to my payment gateway
        $lastOrder->setData('test','test data');
        $lastOrder->save();
        
        //make payment gateway api call, get payment url
        return url;
    }

}

此 class 然后由自定义控制器使用:

class Index extends \Magento\Framework\App\Action\Action
{
    public function __construct(
        \Magento\Framework\App\Action\Context $context,
        \MyModule\Payment\Model\Api $moduleApi,
        \Magento\Checkout\Model\Session $session
    ) {
        parent::__construct($context);

        $this->moduleApi = $moduleApi;
        $this->session = $session;
    }
   
 public function execute() {
       $token = $this->moduleApi->requestAuthToken();

       if ($this->session->getLastRealOrder() && $token !== null) {
            $url = $this->moduleApi->createOnlinePurchase($token, $this->session->getLastRealOrder());

            if ($url !== null && substr($url, 0, 4) == 'http') {
               $this->session->clearStorage();     
               return $this->resultRedirectFactory->create()->setUrl($url);
            } 
            else {
                $this->messageManager->addError(__("Url invalid: ".$url));
                return $this->resultRedirectFactory->create()->setPath('checkout/onepage/failure');
            }
       }
}

在由我的支付网关触发的第二个自定义控制器 Callback 上,我使用 $order = $this->getOrderFactory->create()->loadByIncrementId($incrementId)

检索了订单对象

其中 $this->getOrderFactory 是我注入的 \Magento\Sales\Model\OrderFactory 的实例。

我从支付网关收到了 increment id

在这个 Callback class 中,当我使用 $order->getData('test') 时,我什么也得不到

我的问题是

我在这里缺少一些核心的 magento 概念吗?

或者有没有其他方法可以在 Callback 中检索此测试数据,其中只有 increment Id 的信息(因为在回调时,用户已经离开 magento 并返回)

这对我来说很奇怪,因为我可以编辑和保存来自 Callback 的订单,但我的额外数据不是 saved/associated 订单对象本身

提前致谢!

更新

我确认我通过使用从我的支付网关获得的 order id 获得了与来自 session's Last Order

的相同的订单对象(行)

我在上面 Api class 中的 lastOrder 上调用了 addStatusHistoryComment 并且还在我的回调 class 中调用了 addStatusHistoryComment 两个调用都在我的管理仪表板中更新相同的订单

我还确认在我设置后立即调用 getData('test') 它会给我想要的数据。

所以我不明白为什么从 Callback 调用时 getData 不起作用

我最终使用 setCustomerNote 代替 setData 和自定义键,这很奇怪,因为它确实在做:

return $this->setData(OrderInterface::CUSTOMER_NOTE, $customerNote);

我只能在 magento 2 上假设。4.x(这是我正在使用的 btw),setData 仅限于预定义的键。

您不能只向订单对象添加数据,每个模型都会自动映射到 DB tables 列,对象将临时存储数据而不会出错,但它不会持久保存在数据库中。注释之所以有效,是因为它们在数据库中占有一席之地,并且在保存和加载时有额外的代码将其保存并添加到模型中。

为了在订单中保留新数据,您需要添加新的订单属性或简单地在销售订单上添加一个新列 table。保存时,键多与您创建的新列的名称完全匹配。