Session check bevor cached seite geliefert ist

Hallo,

Ich habe ein subscriber der registriert ist für event:

 Enlight_Controller_Action_PreDispatch_Frontend 

Und hier checke ich in session ob eine variable eingestellt ist (dann soll request wie normal bearbeitet werden). Und falls die variable nicht in session ist, soll ein redirect passieren.
das funktioniert in development modus alles, problem ist wenn produktion modus anschalten ist und seiten von cache kommen. Dann ist diese check nicht gemacht.

Gibt es ein möglichkeit zum session zum checken bevor seite von cahche geladen ist?

 

Vielen dank für ihre Hilfe!

Nein. Da gibt es keine Möglichkeit. Die Seite wird aus dem Cache genommen bevor Shopware überhaupt “gestartet” wird. Du kannst natürlich den entsprechenden Controller und die Aktion aus dem Caching ausschließen.

Schau dir viellauch auch mal diesen Artikel an. Vielleicht hilft er dir weiter.

https://developers.shopware.com/developers-guide/http-cache/#live-caching

Danke für dein Antwort @arnebecker‍ !
Gibt es ein Möglichkeit ein skript bevor in cache geschaut ist schreiben? Also ich muss unbedingt in session schauen ob ein parameter dort ist und sonst login zeigen, weil seite nur für leute mit bestimten daten erreichbar soll sein. Also „login“ controller soll für alle erreichbar sein und alle andere seiten nür wenn eine variable in session definiert ist. Ich könnte ein ganz einfache .php skript schreiben (wo in $_SESSION die variable gesucht ist und falls es nicht gefunden ist, liefere ich ein redirect) und die dann in shopware.php inkludieren, aber das problem ist das ist dann verloren wenn shopware updated ist. oder?

Hallo @flynorc‍,

Ich glaube beim Plugin Skript gibt nicht zu tun mit dem Frontend Casche.

kannst du biit Ihre Funktion hier posten, so ich weiß was passiert hier.

VG,

Ahmad

Du könntest dir mal die CustomerStreams in Shopware ansehen, die Logik passiert auch vor der Auslieferung des Caches.

 

kannst du biit Ihre Funktion hier posten, so ich weiß was passiert hier.

 Hier is die funktion die geruft wird wenn Enlight_Controller_Action_PreDispatch_Frontend event passiert.

Es ist nicht anders als checken ob session passengerId variable hat. Und falls es nicht hat ein redirect zum login seite. Die login seite ist einfach ein formular und wenn es submitted ist, is einfach passengerId in session gespeichert (und dann kann benutzer alle andere shop seite benutzen, bevor soll aber immer zu diese login formular kommen).

Ich glaube ich könnte diese check einfach in shopware.php machen mit $_SESSION variable, aber diese änderungen sind dann immer verloren wenn shopware updated ist? Kann ich in diese datei zum $_SESSION variable zugreifen?

    public function onFrontendPreDispatch(\Enlight_Event_EventArgs $arguments)
    {
        /** @var \Enlight_Controller_Action $controller */
        $controller = $arguments->get('subject');
        $controllerName = $controller->Request()->getControllerName();

        $passengerId = null;
        if(Shopware()->Session()) {
          $passengerId = Shopware()->Session()['passengerId'];
        }


        if(empty($passengerId) && $controllerName !== "passenger") {
            $controller->redirect('frontend/passenger/login');
        }
    }

 

@Moritz Naczenski schrieb:

Du könntest dir mal die CustomerStreams in Shopware ansehen, die Logik passiert auch vor der Auslieferung des Caches.

Leider nicht, weil das sind keine echte kunden, sind nur potentiale kunden die zugriff zum shop haben soll. Die loggen sich nicht mit email und passwort aber mit anderen daten (die kommen von ein external source und sind in custom tabellen gespeichert).

Vielleicht kann man die Symfony HTTP Cache Komponente dekorieren? Aber wissen tue ich es nicht.

Du musst einfach nur einen (z.B.: frontend/widget) controller schreiben der diese Arbeit übernimmt. So wie vorgesehen.

@BestShopPossible schrieb:

Du musst einfach nur einen (z.B.: frontend/widget) controller schreiben der diese Arbeit übernimmt. So wie vorgesehen.

 Habe ich ja schon, aber funktioniert nicht wenn eine gecachte seite geladen wird. Dann ist diese controller einfach nicht geruft und seite gezeigt obwohl benutzer nicht die variable in session hat. Ich versuche noch mit widget ob so was bringt.

{action …

So ruft man das dann im Theme auf. Shopware erzeugt aus diesem Aufruf eine Inkludierung mittels ESI-Tag, heißt was aus diesem Controller kommt wird nicht gecached.

Und da deine Funktion onFrontendPreDispatch heißt, schließe ich daraus, dass das kein eigener Controller ist, sondern du dich in ein PreDispatch Event hängst. 

@BestShopPossible schrieb:

{action …

So ruft man das dann im Theme auf. Shopware erzeugt aus diesem Aufruf eine Inkludierung mittels ESI-Tag, heißt was aus diesem Controller kommt wird nicht gecached.

Danke für dein vorschlag. Habe ach das schon versucht, aber drinnen von {action… tag kann ich kein redirect machen :confused: und seite ist trotzdem angezeigt nur ein fehler meldung kommt wo diese action tag ist

Funktioniert schon wenn man es richtig macht:

https://developers.shopware.com/developers-guide/controller/#plugin-controllers

Das stimmt allerdings. Man kann zwar den Subrequest redirecten aber nicht den Hauptrequest.

Also wenn ich das richtig verstehe, kann ich nichts machen, auser in shopware.php ein gehen und schauen wo kann ich erst session variable kriegen, bevor in cache gesucht ist?

weil ich brauche ja hauptrequest weiterleiten zum login page.

Hallo,

wenn du das ganze über einen Cookie (statt über die Session) machen kannst, wäre das prinzipiell möglich, weil du Shopware „beibringen“ kannst, auch deine Custom-Cookies beim Caching zu berücksichtigen. Dann ließe sich das so implementieren, dass Besucher, die den Cookie nicht haben, auf die Anmeldeseite weitergeleitet werden (das würde dann gecacht, ist aber ja auch so intendiert). Benutzer, die den Cookie haben mit Wert X, würden den Shop ganz normal durchstöbern können und sich den Cache wiederum teilen.

Das mit den Cache-Cookies ist ebenfalls im „Live-Caching“ Abschnitt des Wikis beschrieben: Shopware HTTP cache

Grundsätzlich ist es so, dass du nicht (ohne große Verbiegungen) Logik vor dem Cache ausführen kannst, wenn eine Seite erstmal gecacht ist. Du kannst aber immer durch Erweitern des Cache-Keys (wie hier mit Cookie) dem Cache beibringen, dass je nach Cache-Key nochmal unterschiedliche Logik für die Seiten greift. 

Daniel

1 „Gefällt mir“