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

cld4siwp  于 2022-11-12  发布在  其他
关注(0)|答案(2)|浏览(115)

我有这门课

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 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 I注入的示例。
我从我的支付网关拿回了increment id
在这个Callback类中,当我使用$order->getData('test')时,什么也得不到
"我的问题是"
我是不是漏掉了什么魔法的核心概念?
或者,是否有其他方法可以在Callback中检索此测试数据,其中仅包含increment Id的信息(因为在回调时,用户已离开magento并返回)
这对我来说很奇怪,因为我可以从Callback编辑和保存订单,但我的额外数据没有保存/与订单对象本身关联
提前感谢!

更新

我确认通过使用从支付网关获得的order id和从session's Last Order获得的order id获得了相同的订单对象(行
我在上面的Api类中调用了lastOrder上的addStatusHistoryComment,还在回调类中调用了addStatusHistoryComment,这两个调用都在更新我的管理控制面板中的同一订单
我也已经确认调用getData('test')的权利后,我设置它给我我想要的数据。
所以我不明白为什么从Callback调用getData时不起作用

kpbpu008

kpbpu0081#

你不能只是添加数据到订单对象,每个模型自动Map到数据库表列,对象将临时存储数据,不会出错,但它不会在数据库中持久。注解工作的原因是,因为它们在数据库中有一个位置,在保存和加载时,有额外的代码保存并添加到模型中。
为了在订单中保留新数据,您需要添加新的订单属性,或者只是在销售订单表中添加一个新列。保存时,关键字必须与您创建的新列的名称完全匹配。

xwmevbvl

xwmevbvl2#

我最终使用setCustomerNote代替了带有自定义键的setData,这很奇怪,因为它实际上是在做:
return $this->setData(OrderInterface::CUSTOMER_NOTE, $customerNote);
我只能假设在magento 2.4.x上(这是我正在使用的btw),setData只限于预定义的键。

相关问题