Как изменить статус заказа на оплаченный после выбора офлайн-платежа?

Как при использовании стабильного 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

Завтра попробую главу Завершение платежа с переходом конечного автомата из документации. Я думаю о том, чтобы поместить этот код в прослушиватель событий, прослушивающий Заказ созданного события ресурса, хотя обратный вызов конечного автомата звучит как лучшее решение.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
4
0
565
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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);
    }
}

Другие вопросы по теме