Ich versuche mich vor eine Action im Checkout Controller zu hängen und je nach Fall eine andere Response auszusteuern. Wie kann ich das am besten machen? Habe bereit den Controller überschrieben aber bin damit nicht glücklich und es verursacht auch Probleme. Dann habe ich noch folgendes probiert:
/**
* @return array
*/
public static function getSubscribedEvents(): array
{
return [
KernelEvents::CONTROLLER => 'onKernelController',
];
}
/**
* @param ControllerEvent $event
*/
public function onKernelController(ControllerEvent $event)
{
$controller = $event->getController();
if (is_array($controller)) {
$controller = $controller[0];
}
if ($controller instanceof CheckoutController) {
// logic hier
}
}
Das funktioniert auch jedoch komme ich so über $event nicht den aktuellen Sales-Channel. Diesen benötige ich aber um mein Plugin-Config auszulesen. Ideen? Wie macht man es besser? Gibt es dafür eigenen SW Events? Lieder finde ich nichts in der Doku und bei Google.
es gibt den ControllerArgumentsEvent, da hast Du sowohl den controller als auch die arguments, in welcher auch die SalesChannelId steht. Ein Shopware eigener Event dafür ist mir leider auch nicht bekannt.
Danke für deine Antwort. Leider komme ich mit dem Event auch nicht an die SalesChannelId. ControllerArgumentsEvent wird von Symfony direkt gefeuert. Meines Wissens habe ich da keinen Zugriff auf den Context. Bräuchte ein SW Event dafür.
Ich habe es jetzt anders gelöst da die hier beschriebene Lösung bei mir nicht funktioniert hat. Für alle die ähnliches vorhaben hier meine Lösung. Ob das best practice ist weiß ich aktuell noch nicht
/**
* @return array
*/
public static function getSubscribedEvents(): array
{
return [
ControllerArgumentsEvent::class => 'onControllerEvent',
];
}
/**
* @param ControllerArgumentsEvent $event
*/
public function onControllerEvent(ControllerArgumentsEvent $event): void
{
$controller = $event->getController();
if (is_array($controller)) {
$controller = $controller[0];
}
if ($controller instanceof CheckoutController) {
/** @var SalesChannelContext $context */
$context = $event->getRequest()->attributes->get(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_CONTEXT_OBJECT);
// further logic
}
}