Как при использовании стабильного 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
Завтра попробую главу Завершение платежа с переходом конечного автомата из документации. Я думаю о том, чтобы поместить этот код в прослушиватель событий, прослушивающий Заказ созданного события ресурса, хотя обратный вызов конечного автомата звучит как лучшее решение.




Наконец, он заработал:
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);
}
}