Redirect im Subscriber (Plugin)

Moin,

ich habe CartConvertedEvent erweitert um vor dem Bezahlprozess noch einmal den aktuellen Lagerbestand an einer anderen API zu testen. Nun möchte ich bei fehlenden Bestand den Kunden zurück zum Warenkorb redirecten. Wie kann ich das am besten anstellen, welchen Service benötige ich dafür?
Ich habe gesehen, dass man es wohl auch mit einen listener an KernelEvents::RESPONSE erreichen kann, dass scheint mir aber nicht der richtige weg zu sein. Dann würde mein Plugin ja in jeder Abfrage einmal die route testen müssen.

class CartConvertedEventSubscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents(): array
    {
        return [
            CartConvertedEvent::class => 'onCartConverted',
        ];
    }

    public function onCartConverted(): void
    {
        $cart = $event->getCart();
        // check if a items is not in stock
        if (!$this->checkStockAvailability($cart)) {
            // Redirect to shopping cart
        }
    }
}```

Besten Dank :pray:

Nicht getestet:

$this->RedirectToRoute('frontend.checkout.cart.page');
1 „Gefällt mir“

Leider funktioniert das ganze so noch nicht, da die Methode redirectToRoute nicht bekannt ist :thinking:

Attempted to call an undefined method named "redirectToRoute" of class "ProductAvailabilityChecker\Subscriber\Core\CheckoutOrderPlacedEventSubscriber".

Ich habs jetzt doch endlich hinbekommen ! :slight_smile:

ich habe das RouterInterface als Service in der services.xml aboniert:

<argument type="service" id="Symfony\Component\Routing\RouterInterface" />

Und anschließend im konstruktor initalisiert:

    public function __construct(RouterInterface $router)
    {
        $this->router = $router;
    }

Anschließend kann ich in der Funktion ein redirect durchführen

   public function onCartConverted(CartConvertedEvent $cartConvertedEvent): void
    {
        // $this->redirectToRoute('frontend.checkout.cart.page');
        $redirectResponse = new RedirectResponse($this->router->generate('frontend.checkout.cart.page'));
        $redirectResponse->send();

Ein redirect wird im Subscriber nicht funktionieren, denke ich.

Guck dir den entsprechenden CheckoutController , die entsprechende Methode, an, was bei einer Exception passiert. Eventuell kannst du bei deinem Event eine Exception werfen, so das ein redirect stattfinden kann.

Oder vor der Zahlung, beim Aufrufen des Checkouts/Confirmpage fügst du deinem Cart einen Error hinzu, sodass eine Bestellung nicht durchgeführt werden kann.

1 „Gefällt mir“

Vielen Dank für deine Hilfe! :slight_smile:

Ich habe es noch zum laufen bringen können! :slight_smile:

    public function __construct(RouterInterface $router, CartService $cartService)
    {
        $this->router = $router;
        $this->cartService = $cartService;
    }
    public function onCartConverted(CartConvertedEvent $cartConvertedEvent): void
    {
        $cart = $event->getCart();
        // check if a items is not in stock
        if (!$this->checkStockAvailability($cart)) {
           $redirectResponse = new RedirectResponse($this->router->generate('frontend.checkout.cart.page'));
           $redirectResponse->send();
           die();
        }
    }