Shopware6 : 订单支付时订阅哪个事件?
Shopware6 : Which event to subscribe when an order is paid?
我想知道如果我想在订单创建后 PAID 时触发一个函数,我应该使用哪个 事件 由客户。
我已经尝试过这个: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');
}
}
我为此使用了 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();
}
}
在您的服务中 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>
我想知道如果我想在订单创建后 PAID 时触发一个函数,我应该使用哪个 事件 由客户。
我已经尝试过这个: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');
}
}
我为此使用了 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();
}
}
在您的服务中 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>