State_enter.order_transaction.state.paid und keine Transaktionsdaten

Hallo,

ich schreibe ein Plugin, bei dem ich nach Bezahlung die Bestelldaten weiter verarbeiten will. Leider bekomme ich keine OrderTransactionCollection von der StateMachineStateEntity und kann daher die Bezahlmethode nicht herausfinden. Letztendlich will ich auch die PayPal-TransaktionsID verarbeiten.

Hier eine gekürzte Version:

<?php declare(strict_types=1);

use Psr\Log\LoggerInterface;
use Shopware\Core\Checkout\Order\Event\OrderStateMachineStateChangeEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class OrderTransactionStatePaidListener implements EventSubscriberInterface
{
    /**
     * @var Client
     */
    private Client $client;

    /**
     * @var LoggerInterface
     */
    private LoggerInterface $logger;

    public function __construct(LoggerInterface $logger) {
        $this->logger = $logger;
    }

    public static function getSubscribedEvents(): array
    {
        return [
            'state_enter.order_transaction.state.paid' => 'onOrderTransactionStatePaid',
        ];
    }

    public function onOrderTransactionStatePaid(OrderStateMachineStateChangeEvent $event): void
    {
        $order = $event->getOrder();
        $orderCustomer = $order->getOrderCustomer();
        $customer = $orderCustomer->getCustomer();
        $deliveries = $order->getDeliveries();
        $shippingAddress = $deliveries->getShippingAddress()->first();
        $billingAddress = $order->getBillingAddress();

        $stateMachineState = $order->getStateMachineState();
        $orderTransactions = $stateMachineState->getOrderTransactions();

        if ($orderTransactions !== null) {
            $orderTransaction = $orderTransactions->filterByState('paid')->first();
            $this->logger->info('payment method', [$orderTransaction->getPaymentMethod()->getName()]);
        } else {
            $this->logger->info('No order transaction there', ['order number' => $order->getOrderNumber()]);
        }

        if ($billingAddress === null) {
            $billingAddress = $shippingAddress;
            $this->logger->info('Billing address not found, using shipping address',
                ['Order Number', $order->getOrderNumber()]
            );
        }
    }
}

Wieso bekomme ich bei $stateMachineState->getOrderTransactions() „null“ zurück? Und wieso bekomme ich ebenso „null“ bei $order->getBillingAddress()?

Liebe Grüße
Sebastian

Meine Vermutung ist, dass es sich um eine Optimierung handelt. Aufträge (generell Assoziationen) werden nicht geladen, da sie zusätzliche Datenbank-Queries bedeuten. Wenn alles eifrig geladen würde, schießen die Queries in die Höhe, ebenso deine Shop-Antwortzeiten.

Du kannst die benötigten Daten mit Repositories explizit nachladen.

Danke, so hat es funktioniert über die Repositories!