ich möchte mich auf das PageLoadedEvent subscriben. Also der für alle pageloads.
public static function getSubscribedEvents(): array
{
return [
PageLoadedEvent::class => 'onPageLoaded'
];
}
public function onPageLoaded($event){
die('foo');
}
Leider passiert hier gar nichts. Andere, z.B. ProductPageLoadedEvent funktionieren.
Ich möchte hier noch mal auf das Thema zurück kommen. Meine Versuche haben bisher keine Resultat gebracht:
use Shopware\Storefront\Page\PageLoadedEvent;
class MySubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
GenericPageLoadedEvent::class => 'onPageLoaded'
];
}
public function onPageLoaded(PageLoadedEvent $event): void
{
echo "onPageLoaded";
}
}
Tests mit ProductEvents funktionieren, aber GenericPageLoadedEvent reagiert gar nicht. Da kommt auch keine Fehlermeldung. Bin etwas ratlos.
ich habe ein ähnliches Problem,
ich möchte gern 404 Fehler in 200 umwandeln.
Leider greift folgender Code nicht, hat jemand eine Idee?
<?php
namespace MyVendor\Rvdw404to200;
use Shopware\Core\Framework\Plugin;
use Shopware\Core\Framework\Event\PageErrorEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Response;
class Rvdw404to200 extends Plugin implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
PageErrorEvent::class => 'onPageError'
];
}
public function onPageError(PageErrorEvent $event): void
{
$response = $event->getResponse();
if ($response->getStatusCode() === 404) {
$response->setStatusCode(Response::HTTP_OK);
}
}
}
Warum sollte man das tun? Die Statusmeldung ist doch sinnvoll. Woher soll sonst ein Cawler z.B. wissen, dass es eine Seite oder Artikel nicht (mehr) gibt?
Ich habe eine Single Page Application und die Inhalte werden mit Ajax geladen. Hinter der URL gibt es jedoch keine „echte“ URL. Also spuckt mir Shopware ein 404 aus, ich will dem Crawler und dem Besucher jedoch signalisieren, dass es ein 200er ist.
@Moorleiche vielen Dank, hast du das getestet? chatgpt hatte das gleiche vorgeschlagen, aber es funktioniert nicht.
<?php
namespace MyVendor\No404Plugin;
use Shopware\Core\Framework\Plugin;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
class No404Plugin extends Plugin implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
KernelEvents::RESPONSE => 'onKernelResponse',
];
}
public function onKernelResponse(ResponseEvent $event): void
{
$response = $event->getResponse();
if ($response->getStatusCode() === Response::HTTP_NOT_FOUND) {
$response->setStatusCode(Response::HTTP_OK);
}
}
}
es gab auch verschieden Ansätze mit der Ladereihenfolge:
Klar funktioniert der Code nicht, da die Response ja gesetzt wird nachdem der Controller gefunden wurde. Da aber kein Crontroller gefunden wird, wirft der Kernel vorher einen Error. Hier kannst du z.B. auf ExceptionEvent::class subscriben und deinen eigene Exception mit 200 Status werfen (lol).
Ist die ganze Logik dahinter schon sehr fragwürdig. Wenn du den Status Code manipulieren musst, damit deine Anwendung funktioniert, kann eigentlich etwas nicht stimmen. Ich würde nach einer Lösung suchen, in der du die Status-Codes erst gar nicht manipulieren musst.