symfony - 选择线下支付后如何将订单状态更改为已支付?
问题描述
使用 stable Sylius 1.2.0
,如何在选择离线支付方式后将订单标记为已付款?
尝试使用sylius_order_payment
状态机的后回调,但它似乎不会在任何转换时触发:
winzou_state_machine:
sylius_order_payment:
callbacks:
after:
set_order_paid:
on: ['complete']
do: ['@AppBundle\Payment\StateMachine\Callback\CallbackClass', 'updateOrder']
args: ['object']
状态机是否完全被使用?也许我用错了。欢迎任何建议。感谢您的耐心等待。
更新 1
明天我将尝试使用文档中的状态机转换章节完成付款。我正在考虑将此代码放在一个事件侦听器中,侦听Order created resource event,尽管状态机回调听起来是一个更好的解决方案。
解决方案
终于让它工作了:
state_machine.yml
:
winzou_state_machine:
sylius_order_checkout:
callbacks:
after:
app_order_complete_set_paid:
on: ['complete']
do: ['@AppBundle\Order\StateMachine\Callback\OrderCompleteSetPaidCallback', 'setPaid']
args: ['object']
services:
_defaults:
autowire: true
autoconfigure: true
public: true
AppBundle\Order\StateMachine\Callback\OrderCompleteSetPaidCallback: ~
OrderCompleteSetPaidCallback.php
:
<?php
namespace AppBundle\Order\StateMachine\Callback;
use SM\Factory\FactoryInterface;
use AppBundle\Infrastructure\CommandBus\CommandBus;
use AppBundle\Order\SetPaid\SetPaidCommand;
use Sylius\Component\Core\Model\OrderInterface;
use Sylius\Component\Payment\PaymentTransitions;
final class OrderCompleteSetPaidCallback
{
private $stateMachineFactory;
public function __construct(FactoryInterface $stateMachineFactory)
{
$this->stateMachineFactory = $stateMachineFactory;
}
public function setPaid(OrderInterface $order): void
{
if (!($lastPayment = $order->getLastPayment())) {
return;
}
if ('cash_on_delivery' === $lastPayment->getMethod()->getCode()) {
$this->transition($order);
}
}
private function transition(OrderInterface $order): void
{
$stateMachine = $this->stateMachineFactory->get($order, OrderPaymentTransitions::GRAPH);
$stateMachine->apply(OrderPaymentTransitions::TRANSITION_PAY);
$payment = $order->getLastPayment();
$stateMachine = $this->stateMachineFactory->get($payment, PaymentTransitions::GRAPH);
$stateMachine->apply(PaymentTransitions::TRANSITION_COMPLETE);
}
}
推荐阅读
- php - Wordpress /cp_errordocument.shtml(端口 443)
- python - 如何在 boto 3 lambda 上提取 zip 文件并保留原始内容类型
- python - 初始训练后如何将训练数据添加到模型中?
- c# - 在 docker 上运行时出现 FileNotFound 异常
- material-ui - Material-UI DataGrid - 没有复选框 onClick 事件?
- asp.net-mvc - 如何让 .Net Core Web 应用程序从 SQL Server 2012 SSRS 请求报告并将其呈现为 PDF?
- python - Sklearn - 适合、缩放和变换
- ssl-certificate - 如何使用 ssl 证书从我的 laravel 应用程序向外部 api 进行身份验证?
- android - Androidx.core 1.6.0 抛出错误:无法访问 'kotlin.Lazy'
- c# - 在逗号和 x 个字符后拆分字符串