Hi,
in Shopware 5 bekomme ich ja über $args->getSubject(); eine redirect methode, wenn ich in einem Subscriber bin.
Also sowas:
public function onPostDispatch(\Enlight_Event_EventArgs $args) {
$subject = $args->getSubject();
$subject->redirect([
'controller' => 'index',
'action' => 'index'
]);
}
}
Gibt es so eine Methode auch bei Shopware 6, wenn ich einen EventSubscriberInterface implementiere?
Ich würde gerne von einer Seite zur anderen weiterleiten in meinem Plugin.
Viele Grüße
Schon mal vielen Dank!
Aber bei mir passt es mit den Objekten so nicht ganz.
Ich versuche weiterzuleiten, wenn ich auf einen bestimmten Controller zugreife.
In dem gezeigten Subscriber hängt er sich aber an KernelEvents::EXCEPTION und in der Methode kommt ein ExceptionEvent als Parameter.
Ich habe noch versucht mich in KernelEvents::CONTROLLER zu hängen, denn über den Controller könnte ich ja auch redirecten.
Aber auf die Weise gibt es nur 500er Fehler.
Also so ganz hilft mir das leider noch nicht
Edit: Ich habe mir nun über die services.xml einfach einen importiert. Leider ist die Methode redirectTo protected, sodass sie mir in EventSubscriber nichts bringt…
Edit2: Ich habe nun einen eigenen Controller geschrieben, der meine gewünschte Route überschreibt. So kann ich auf die redirectToRoute Methode zugreifen und weiterleiten, sobald jemand auf die Route zugreifen will. Thanks to @SorinSologics2019
Die Frage, ob/wie man innerhalb eines EventSubscribers weiterleiten kann, bleibt trotzdem.
In Shopware 5 war das ja auch auf sehr einfache Weise möglich. Wäre schade, wenn es in Shopware 6 nur über CustomController gehen würde.
Hallo Zusammen,
Wir haben vorerst einen Weg gefunden, aus einem Subscriber auf eine andere Seite weiterzuleiten.
Verwendet wird hierfür das Event KernelEvents::REQUEST welches die Bearbeitung von Requests und Responses erlaubt.
Anschließend kann bspw. die aufgerufene Route geprüft werden. Wichtig ist, dass nur in bestimmten Fällen weitergeleitet wird, da man sonst eine Endlosschleife erzeugt:
/**
* @return array
*/
public static function getSubscribedEvents()
{
return [
KernelEvents::REQUEST => 'onHandleRequest'
];
}
/**
* Handles Kernel requests. Test redirect account home page to home page of shop.
*
* @param RequestEvent $event
*/
public function onHandleRequest(RequestEvent $event)
{
// get current request route
$route = $event->getRequest()->attributes->get('_route');
// only redirect if account overview page was called
if ($route === 'frontend.account.home.page') {
// generate url from home page route
$url = $this->container->get('router')->generate('frontend.home.page');
// set RedirectResponse as response of the event
$event->setResponse(new RedirectResponse($url));
}
}
Viele Grüße
Dennis
Hallo Dennis,
wie hast du den Container dem Subscriber übergeben, sodass du
$this->container
aufrufen kannst?
@Adelbert schrieb:
Hallo Dennis,
wie hast du den Container dem Subscriber übergeben, sodass du
$this->container
aufrufen kannst?
Hallo!
Einfach in der services.xml den Subscriber registrieren und den service_container als Argument übergeben:
Anschließend kann dann der container im Constructor des Subscribers als Variable gesetzt werden:
/** @var ContainerInterface */
private $container;
/** @var SystemConfigService */
private $systemConfig;
public function __construct(ContainerInterface $container, SystemConfigService $systemConfig)
{
$this->container = $container;
$this->systemConfig = $systemConfig;
}
Viele Grüße
Dennis
Hallo,
wie bekomme ich auf dem Event “KernelEvents::REQUEST” den salesChannelContext?
Ich muss ein Produkt laden, aber ohne diesen Context geht es anscheinend nicht.
Hey,
da hänge ich mal dran, ich habe das gleiche Problem. Sales-Channel-Id habe ich, brauche aber den Sales-Channel-Context.
Hat hier jemand eine Lösung gefunden wie man an den Context kommt? Möchte einen Redirect machen je nach dem ob ein Kunde eingeloggt ist oder nicht.
Falls noch jemand vor dem Problem steht. Ich habe es so lösen können.
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
{
$redirectResponse = new RedirectResponse($this->router->generate('frontend.checkout.cart.page'));
$redirectResponse->send();
die()
}