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。保存时,键多与您创建的新列的名称完全匹配。
我有这个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。保存时,键多与您创建的新列的名称完全匹配。