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:
Leider funktioniert das ganze so noch nicht, da die Methode redirectToRoute nicht bekannt ist
Attempted to call an undefined method named "redirectToRoute" of class "ProductAvailabilityChecker\Subscriber\Core\CheckoutOrderPlacedEventSubscriber".
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.
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();
}
}