为了账号安全,请及时绑定邮箱和手机立即绑定

Shopware6:订单支付后订阅哪个活动?

Shopware6:订单支付后订阅哪个活动?

PHP
梵蒂冈之花 2023-07-08 16:23:46
我想知道如果我想在客户创建订单后付款时触发某个功能,应该使用哪个事件。我已经尝试过这个:state_enter.order_transaction.state.paid => 'onOrderCheckout'。不幸的是,它给出了一个错误:“ 警告:使用未定义的常量 state_enter - 假设为 'state_enter'(这将在 PHP 的未来版本中引发错误)*”。这是我的订阅者:namespace Emakers\TransmissionPlugin\Subscriber;use Symfony\Component\EventDispatcher\EventSubscriberInterface;use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityLoadedEvent;use Symfony\Component\HttpKernel\Event\ExceptionEvent;use Shopware\Core\Checkout\Order\OrderEntity;use Shopware\Core\Checkout\Order\OrderEvents;use Shopware\Core\System\StateMachine\Event;use Shopware\Core\Framework\Event\EventData\EntityType;use Shopware\Core\System\SystemConfig\SystemConfigService;use Symfony\Component\HttpKernel\KernelEvents;use Symfony\Component\DependencyInjection\ContainerInterface;use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;use Emakers\TransmissionPlugin\Services\ShopwareConnectService;class OrderSubscriber implements EventSubscriberInterface{    /**     * @ContainerInterface $container     */    private $container;     /**     * @var datetime     */     private $now;     public function __construct(ContainerInterface $container) {                $this->container = $container;                $this->now = date('Y-m-d H:i:s');     }    public static function getSubscribedEvents(): array    {        return [                'state_enter.order_transaction.state.paid'   => 'onOrderCheckout',        ];    }        public function orOrderCheckout($event)        {                var_dump($event);                die('here we are');        }}
查看完整描述

1 回答

?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

我为此使用 StateMachineTransitionEvent。使用 Shopware 6.2 进行测试。


<?php declare(strict_types=1);


namespace Your\Namespace;


use Shopware\Core\Checkout\Order\Aggregate\OrderTransaction\OrderTransactionDefinition;

use Shopware\Core\Checkout\Order\Aggregate\OrderTransaction\OrderTransactionStates;

use Shopware\Core\Checkout\Order\OrderEntity;

use Shopware\Core\Framework\Context;

use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;

use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;

use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;

use Shopware\Core\System\StateMachine\Event\StateMachineTransitionEvent;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;


class OrderStateSubscriber implements EventSubscriberInterface {


    /**

     * @var EntityRepositoryInterface

     */

    private $stateMachineStateRepository;


    /**

     * @var EntityRepositoryInterface

     */

    private $orderRepository;


    public function __construct(EntityRepositoryInterface $stateMachineStateRepository, EntityRepositoryInterface $orderRepository)

    {

        $this->stateMachineStateRepository = $stateMachineStateRepository;

        $this->orderRepository = $orderRepository;

    }


    public static function getSubscribedEvents(): array

    {

        return [

            StateMachineTransitionEvent::class => 'onStateTransition'

        ];

    }


    public function onStateTransition(StateMachineTransitionEvent $event) {

        // Since you are only interested in order transitions

        if ($event->getEntityName() !== OrderTransactionDefinition::ENTITY_NAME) {

            return;

        }


        $orderTransactionsStatePaidId = $this->getOrderTransactionsStatePaidId($event->getContext());

        if ($orderTransactionsStatePaidId === null) {

            return;

        }


        // Check if it was transitioned to paid

        if ($event->getToPlace()->getId() !== $orderTransactionsStatePaidId) {

            return;

        }


        // Transaction was changed to paid do your thing

        $order = $this->getOrder($event->getEntityId(), $event->getContext());

    }


    private function getOrderTransactionsStatePaidId(Context $context): ?string {

        $criteria = new Criteria();

        // Add filter for OrderTransactionStateMachine

        $criteria->addFilter(

            new EqualsFilter('stateMachine.technicalName', \sprintf('%s.state', OrderTransactionDefinition::ENTITY_NAME)),

            new EqualsFilter('technicalName', OrderTransactionStates::STATE_PAID)

        );


        return $this->stateMachineStateRepository->searchIds($criteria, $context)->firstId();

    }

    

    private function getOrder(string $orderTransactionId, Context $context): ?OrderEntity

    {

        $criteria = new Criteria();

        $criteria->addFilter(

            new EqualsFilter('transactions.id', $orderTransactionId)

        );

        

        return $this->orderRepository->search($criteria, $context)->first();

    }

}

在您的 services xml 中添加如下内容。当然你需要调整FQCN(FullyQualifiedClassName)。


<service id="Your\Namespace\OrderStateSubscriber">

    <argument type="service" id="state_machine_state.repository"/>

    <argument type="service" id="order.repository"/>

    <tag name="kernel.event_subscriber"/>

</service>


查看完整回答
反对 回复 2023-07-08
  • 1 回答
  • 0 关注
  • 87 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信