Controller Events

Hallo.

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.

 

Gruß Mike

Hallo Mike,

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.

Hi mowlwurf.

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.

Hast du vielleicht ein Code Beispiel für mich?

 

Gruß

Guten Morgen Mike,

hatte mir im HttpKernel die Variable $arguments ausgeben lassen welche in den Event übergeben wird.

$event = new ControllerArgumentsEvent($this, $controller, $arguments, $request, $type);
var_dump($arguments);exit;

Resultat war

array(2) { [0]=> object(Symfony\Component\HttpFoundation\Request)#269 (24) { [“attributes”]=> object(Symfony\Component\HttpFoundation\ParameterBag)#273 (1) { [“parameters”:protected]=> array(21) { [“sw-sales-channel-base-url”]=> string(0) “” [“sw-sales-channel-absolute-base-url”]=> string(20) “http://192.168.33.10” [“resolved-uri”]=> string(1) “/” [“sw-sales-channel-id”]=> string(32) “2bb9f84b57c746e894f64da9f3b09b87” ["_is_sales_channel"]=> bool(true) ["_locale"]=> string(5) “en-GB” [“sw-snippet-set-id”]=> string(32) “d9c2b30ca20744cbadcba55ca90cc32f” [“sw-currency-id”]=> string(32) “b7d2554b0ce847cd82f3ac9bd1c0dfca” [“sw-domain-id”]=> string(32) “b884fe7e9555464181725863c0d939d4” [“theme-id”]=> string(32) “92bdaf5ca2434e0c9e7fcd42d2d02a55” [“theme-name”]=> string(10) “Storefront” [“theme-base-name”]=> NULL [“sw-maintenance”]=> bool(false) [“sw-maintenance-ip-whitelist”]=> NULL ["_route"]=> string(18) “frontend.home.page” ["_controller"]=> string(57) “Shopware\Storefront\Controller\NavigationController::home” ["_route_params"]=> array(0) { } ["_routeScope"]=> object(Shopware\Core\Framework\Routing\Annotation\RouteScope)#951 (1) { [“scopes”:“Shopware\Core\Framework\Routing\Annotation\RouteScope”:private]=> array(1) { [0]=> string(10) “storefront” } } ["_httpCache"]=> array(1) { [0]=> object(Shopware\Storefront\Framework\Cache\Annotation\HttpCache)#942 (2) { [“maxAge”:“Shopware\Storefront\Framework\Cache\Annotation\HttpCache”:private]=> NULL [“states”:“Shopware\Storefront\Framework\Cache\Annotation\HttpCache”:private]=> NULL } } [“sw-context”]=> object(Shopware\Core\Framework\Context)#1888 (12) { [“languageIdChain”:protected]=> array(1) { [0]=> string(32) “2fbb5fe2e29a4d70aa5854ce7ce3e20b” } [“versionId”:protected]=> string(32) “0fa91ce3e96a4bc2be4bd9ce752c3425” [“currencyId”:protected]=> string(32) “b7d2554b0ce847cd82f3ac9bd1c0dfca” [“currencyFactor”:protected]=> float(1) [“currencyPrecision”:protected]=> int(2) [“scope”:protected]=> string(4) “user” [“ruleIds”:protected]=> array(4) { [0]=> string(32) “a2491202b95c40eab761e05989923561” [1]=> string(32) “b653111f5640462d957fd71a99110cfa” [2]=> string(32) “3a204873591e4f068037696550d4cc26” [3]=> string(32) “e2440233634d465f9424bf787f06e09a” } [“source”:protected]=> object(Shopware\Core\Framework\Api\Context\SalesChannelApiSource)#925 (1) { [“salesChannelId”:“Shopware\Core\Framework\Api\Context\SalesChannelApiSource”:private]=> string(32) “2bb9f84b57c746e894f64da9f3b09b87” } [“considerInheritance”:protected]=> bool(true) [“taxState”:protected]=> string(5) “gross” [“useCache”:“Shopware\Core\Framework\Context”:private]=> bool(true) [“extensions”:protected]=> array(0) { } } [“sw-sales-channel-context”]=> object(Shopware\Core\System\SalesChannel\SalesChannelContext)#1816 (14) 

Sind sowohl SalesChannelContext, als auch die ID vorhanden. Hier müsstest Du innerhalb des Events mit folgendem Code an Id und Context rankommen

$event->getArguments()[0]->attributes->get('sw-sales-channel-id');
$event->getArguments()[0]->attributes->get('sw-sales-channel-context');

 

Guten Morgen mowlwurf.

Danke dir! Das werde ich nachher gleich testen. Wünsch dir schon mal ein schönes Wochenende.

 

Gruß Mike

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 :smiley:

/**
 * @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
	}
}

 

1 Like