Erweitertes Doctrine-Model nicht verfügbar

Hallo Community, ich habe ein Plugin geschrieben mit dem ich ein neues Attribut zu einem Model hinzugefügt habe. Nach der Installation funktioniert zunächst alles problemlos, nach einiger Zeit (habe hier noch kein Muster erkannt wann genau) scheint das System aber zu vergessen, dass ich das Model erweitert habe und wirft eine Fehlermeldung, dass das Feld nicht bekannt sei. Folgendes wird bei der Installation des Plugins ausgeführt: $this-\>Application()-\>Models()-\>addAttribute( 's\_emotion\_attributes', 'meinKuerzel', 'meinNeuesFeld', 'int(11)', true, 1 ); // $this-\>getEntityManager() gibt Shopware()-\>Models() zurück $this-\>getEntityManager()-\>generateAttributeModels(array( 's\_emotion\_attributes' )); Habe das jetzt erstmal dadurch gelöst, dass ich die Funktion generateAttributeModels jedes mal aufrufe bevor auf die Daten zugegriffen werden soll. Dadurch scheint das Problem nicht mehr aufzutauchen aber das wird wohl nicht der korrekte Weg sein, oder? Jemand eine Idee was hier falsch ist?

Ich muss das noch mal ausgraben: Ist das Verhalten so korrekt, dass ich das Model jedes mal neu generieren muss bevor ich auf die Daten zugreifen kann? Erscheint mir falsch zu sein, weil es halt auch manchmal so funktioniert und manchmal nicht. Dürfte auch von der Performance her nicht so optimal sein oder? Hier noch ein bisschen Code zur Veranschaulichung: public function afterGetEmotionsQueryBuilder(Enlight\_Hook\_HookArgs $arguments) { // ohne hier das Model nochmal neu zu generieren funktioniert es manchmal nicht $this-\>getEntityManager()-\>generateAttributeModels(array( 's\_emotion\_attributes' )); // Do something with my new field }

Hallo t2oh4e, hast du ggf. einen Cronjob oder irgendeine Funktion am Laufen, die den Shopware-Cache regelmäßig komplett leert? Die Proxy-Dateien der Doctrine-Models werden ebenfalls im Cache abgelegt. Der Aufruf „generateAttributeModels“ generiert eben die Proxy-Dateien bei der Installation. Sollte sich nun eine Applikation/ein Cronjob o.Ä. einmischen, so würde die Proxy-Datei gelöscht werden und entsprechend das Model nicht mehr erweitert werden. Hilft dir das weiter? :slight_smile: Gruß, Patrick :shopware:

Hi Patrick, da es ein Testsystem ist lösche ich den Cache selbst regelmäßig, stimmt. Das der Fehler immer nach dem Löschen auftritt war mir bisher noch nicht aufgefallen. Jetzt weiß ich zumindest den Grund :smiley: Wie geht man denn bei sowas am Besten vor? In meinem Fall brauche ich die Daten jedes Mal wenn eine Einkaufswelt im Frontend geladen wird. Einfach jedes mal neu erstellen wenn es benötigt wird, so wie ich es im Moment mache? Danke für den Hinweis! Viele Grüße Timo

Hallo, die Lösung dafür ist eigentlich recht einfach: Den entsprechenden Ordner nicht löschen/leeren. Es handelt sich dabei um den Ordner cache/doctrine/attributes. Wenn ich mich nicht irre, gibt es ohnehin keinen Grund den genannten Ordner händisch zu leeren/löschen. Gruß, Patrick :shopware:

1 „Gefällt mir“

Hab gerade noch mal geschaut: Die Dateien in dem Ordner sind tatsächlich alle (bis auf die eine die ich regelmäßig neu erstelle) ca. 2 Wochen alt. Also nehm ich die Anweisung jetzt erstmal raus… und dann muss ich mal auf Fehlersuche gehen warum die vorher gelöscht wurden. Danke für deine Hilfe.

Hallo, ich möchte mich hier mal dranhängen. Wenn ein Plugin im Shop installiert wird, das bei der Installation eine Erweiterung des Models durchführt - z. B. wie hier im Beispiel - und aus irgendeinem Grund der Doctrine Cache gelöscht wird, muss dann immer eine Neuinstallation des Plugins erfolgen, um wieder ein erweitertes Model zur Verfügung zu haben? Das ist doch bis jetzt die Quintessenz aus dem Thread. Wie geht man denn vor, um sicherzustellen, dass die Modelerweiterung von Shopware automatisch erneut durchgeführt wird, sobald der Doctrine Cache gelöscht wird? Es kann ja auch der Fall auftreten, dass dieser defekte Datenstrukturen enthält und man ihn per Shell löscht. Was passiert dann mit den Plugins, die ein Model erweitert haben? Wie sieht euer Designschema aus, um einen solchen Fall sicher abzufangen? Man könnte natürlich auf die Existenz der Modelerweiterung prüfen, bevor das Plugin diese verwendet. Gibt es dafür ein Vorgehen, das auch bei den zukünftigen Shopware Releases sicher erhalten bleibt? Viele Grüße HTH