PageLoadedEvent funktioniert nicht

Hallo,

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.

Was mache ich falsch?

Sowas hatte ich auch mal, habe dann in meiner services.xml  noch ein tag hinzugefügt.

Danach das Plugin deaktiviert und aktiviert. Bis lang kann ich jetzt auf jedes Event oder Eventclassen reagieren.

Hch habe den shopware.event_subscriber tag mal hinzugefügt. Das Event wird trozdem nicht getriggert.

das ist gut möglich.

und wie subscribe ich dann alle pageloads?

habs jetzt über FooterPageletLoadedEvent::class gemacht.

Die Frage Ist zwar schon etwas länger her aber mit dem GenericPageLoadedEvent deckt ihr soweit ich das gesehen habe alle PageLoadedEvents ab.

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.

use Shopware\Storefront\Page\GenericPageLoadedEvent;

2 „Gefällt mir“

Oha, da kommt nicht mal eine Fehlermeldung. Danke!

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.

Dann scheint irgendwas im Ansatz falsch zu sein. Ich mache auch ein Single-Page Theme und habe da kein Problem.

Woher hast du denn das PageErrorEvent? Ich finde das nicht.

Das hat mir ChatGPT-4 geschrieben.

EDIT: Danke für den Hinweis. ChatGPT hat sich entschuldigt und mir einen neuen Code vorgeschlagen, ich werde den heute abend mal prüfen.

Leider kann mir ChatGPT-4 hier nicht weiter helfen. Hat jemand eine Idee wie ich 404 in 200 umwandeln kann?
Danke und Gruss

KernelEvents::RESPONSE subscriben

if ($response->getStatusCode() === 404) {
    $response->setStatusCode(200)
}

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

KernelEvents::RESPONSE => ['onKernelResponse', -200],

ebenfalls verschiedene Ansätze mit Controller und Subscriber.

muss man vielleicht irgendeinen cache löschen damit so ein Plugin greift oder reicht einfach install?

Hat jemand vll eine Idee wie man das mit htaccess lösen kann?

Danke und Gruss

  1. Geht das nicht über .htaccess
  2. 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).
  3. 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.