Entity Context Cache dauerhaft deaktivieren?

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

2 Likes

@compragmbh
Hey Dennis.

Hast du dafür eine Lösung gefunden? Diese Cache funktioniert einfach nicht sauber. Es kommen ständig alte Daten zurück obwohl die Informationen in der DB schon lange aktualisiert worden sind.

Grüße
Pascal

Hi PascalDV,

Neuer Account-Name also nicht wundern :slight_smile:

Im Endeffekt konnen wir es über die oben beschriebene 2. Methode lösen. Wir haben eine eigene Context-Klasse erstellt, welche die Shopware Klasse extended und dort für die useCache Methode immer false zurückliefert:

<?php declare(strict_types=1);

namespace Compra\EsiSW6\Core\Framework;

class Context extends \Shopware\Core\Framework\Context
{
    public function getUseCache(): bool
    {
        return false;
    }
}

1 Like

@Dennis_COMPRA_GmbH Vielen Dank für die Mühe und die Antwort! Habt ihr diesen Context denn entsprechend als Standard gesetzt? Wenn ja: wie habt ihr das gemacht? Über Dependency Injection?

Jein. Wir haben an den Stellen wo wir es brauchten unseren eigenen Context gesetzt für die search() und searchIds() Methoden auf die Repos.

Also in der verwendeten Klasse im Constructor:

$this->context = new \Compra\EsiSW6\Core\Framework\Context(new SystemSource());

Und bei Verwendung dann:

$result = $mappingRepo->searchIds($criteria, $this->context);
1 Like

@Dennis_COMPRA_GmbH Alles klar, vielen Dank für deine Antwort! Weiß ich wirklich zu schätzen :grinning: :+1: