compragmbhcompragmbh MemberComments: 40 Received thanks: 2 Member since: October 2014 edited September 16

Hallo!

Wir entwickeln bei uns im Haus eine Schnittstelle um Daten per API in den Shop zu übertragen.

Wir sind nun auf ein Problem gestoßen und konnten dies auf den Entity Context Cache zurückführen.Das Problem ist, das Abfragen und Ergebnisse gecached werden und dann mit dem selben Context keine Ergebnisse gefunden werden.

Da wir ungern für jede Request einen neuen Context erstellen möchten, suchen wir nach einer Möglichkeit den Cache in der Datei vendor/shopware/platform/src/Core/Framework/Context.php dauerhaft zu deaktivieren.
Es gibt ebenfalls folgende Methode disableCache() :

public function disableCache(callable $function)
{
    $this->useCache = false;
    $result = $function($this);
    $this->useCache = true;

    return $result;
}

Hier wird deutlich: Der Cache kann im Standard nun für den Aufruf einer Funktion deaktiviert werden und wird danach wieder aktiviert.
Ebenfalls gibt es in der Context-Klasse nur einen Getter für $useCache, allerdings keinen Setter.

Beispiel welches das Problem praktisch veranschaulicht:

  • Per API + Context werden verschiedene Customer in den Shop übertragen. Soweit so gut.
  • Anschließend werden die Customer Adresses in den Shop importiert. Hier findet jedoch zuvor ein Mapping über die Customernumber der Customer statt
  • Da der gleiche Context verwendet wird, wird jedoch kein Customer anhand einer bestimmten Customernumber gefunden, da die Abfrage offenbar gecached wurde
  • Beim Debuggen nach dem Import der Customer war aber zu sehen, dass die Customer in der DB vorhanden waren - man hätte also ein Ergebnis bekommen müssen
  • Stattdessen liefert die Abfrage mit Filter auf die Customernumber ein leeres Ergebnis zurück

 

Hat jemand eine schicke Lösung für dieses Problem?

Unsere Ansätze hierfür wären:

  1. Für jede Request die disableCache() Methode drum herum bauen
  2. eine eigene Klasse entwickeln, die von Context erbt und dann überschreiben wir die getUseCache() Methode und liefern IMMER false zurück

 

Ich hoffe auf eure Ideen!

Grüße
Dennis

Sign In or Register to comment.