Eventloop nach Update durch Core-Refactoring

Nunja, nachdem wir das Update von 4.2.1 auf 4.3.6 durchgeführt haben, haben wir jetzt leider nen schönen Eventloop bekommen, wenn man sAdmin->sGetUserData() aufruft. Dieses ruft ein paar Helpermethoden, auf in denen Events vorkommen, und wenn man in diesen Events wiederrum sAdmin->sGetUserData() aufruft, bekommt man einen schönen Loop. Konrekt verursacht über ein paar Methoden, bis in die sAdmin->sGetPaymentMeanById() runter, der alte Aufruf zu sBasket $basket = $this-\>sSYSTEM-\>sMODULES['sBasket']-\>sBASKET; immer null zurückgegeben hat, aber der neue $basket = $this-\>moduleManager-\>Basket()-\>sGetBasket(); nun ein gültiges Basketobjekt hergibt, welches schlussendlich den Eventloop bei uns erzeugt. Aber das dürfte auf so jedes Event zutreffen, welches in diesem sGetUserData() vorkommt und man eben wieder dieses aufruft… Stacktrace: Call Stack: 0.0023 285712 1. {main}() /data/www/acme/shopware.php:0 0.0592 1318856 2. Shopware\Kernel-\>handle() /data/www/acme/shopware.php:170 0.3295 7101416 3. Enlight\_Controller\_Front-\>dispatch() /data/www/acme/engine/Shopware/Kernel.php:145 0.9939 21322784 4. Enlight\_Controller\_Dispatcher\_Default-\>dispatch() /data/www/acme/engine/Library/Enlight/Controller/Front.php:228 1.0998 24616040 5. Enlight\_Controller\_Action-\>dispatch() /data/www/acme/engine/Library/Enlight/Controller/Dispatcher/Default.php:528 1.1018 24632920 6. Enlight\_Event\_EventManager-\>notify() /data/www/acme/engine/Library/Enlight/Controller/Action.php:138 1.1078 24859328 7. Enlight\_Event\_Handler\_Plugin-\>execute() /data/www/acme/engine/Library/Enlight/Event/EventManager.php:211 1.1371 25819968 8. Shopware\_Plugins\_Frontend\_ExtendedAccount\_Bootstrap-\>onPreDispatch() /data/www/acme/engine/Library/Enlight/Event/Handler/Plugin.php:149 1.1372 25820128 9. Shopware\_Components\_Utils\_Client-\>getUserData() /data/www/acme/engine/Shopware/Plugins/Local/Frontend/ExtendedAccount/Bootstrap.php:296 1.1373 25820328 10. sAdmin-\>sGetUserData() /data/www/acme/engine/Shopware/Plugins/Local/Core/Utils/Components/Utils/Utils.php:914 1.1536 25897448 11. sAdmin-\>getUserShippingData() /data/www/acme/engine/core/class/sAdmin.php:2656 1.1614 25910352 12. sAdmin-\>sGetPaymentMeanById() /data/www/acme/engine/core/class/sAdmin.php:4643 1.1635 25915552 13. sBasket-\>sGetBasket() /data/www/acme/engine/core/class/sAdmin.php:400 1.2514 28022368 14. sBasket-\>getBasketArticles() /data/www/acme/engine/core/class/sBasket.php:1027 1.2515 28031456 15. sArticles-\>sGetProductByOrdernumber() /data/www/acme/engine/core/class/sBasket.php:1920 1.3193 30200912 16. Enlight\_Event\_EventManager-\>filter() /data/www/acme/engine/core/class/sArticles.php:3682 1.3237 30225040 17. Enlight\_Event\_Handler\_Plugin-\>execute() /data/www/acme/engine/Library/Enlight/Event/EventManager.php:301 1.3238 30225136 18. Shopware\_Plugins\_Frontend\_CheckoutFirewall\_Bootstrap-\>sGetProductByOrdernumber\_FilterResult() /data/www/acme/engine/Library/Enlight/Event/Handler/Plugin.php:149 1.3238 30242312 19. Shopware\_Plugins\_Frontend\_CheckoutFirewall\_Bootstrap-\>processArticle() /data/www/acme/engine/Shopware/Plugins/Local/Frontend/CheckoutFirewall/Bootstrap.php:799 1.3246 30243096 20. Shopware\_Components\_CheckoutUtils\_Client-\>getDispatches() /data/www/acme/engine/Shopware/Plugins/Local/Frontend/CheckoutFirewall/Bootstrap.php:279 1.3246 30243288 21. Shopware\_Components\_CheckoutUtils\_Client-\>getSelectedCountry() /data/www/acme/engine/Shopware/Plugins/Local/Frontend/CheckoutUtils/Components/CheckoutUtils/CheckoutUtils.php:94 1.3246 30243328 22. Shopware\_Components\_CheckoutUtils\_Client-\>getSelectedShipping() /data/www/acme/engine/Shopware/Plugins/Local/Frontend/CheckoutUtils/Components/CheckoutUtils/CheckoutUtils.php:170 1.3247 30243456 23. Shopware\_Components\_CheckoutUtils\_Client-\>getUserData() /data/www/acme/engine/Shopware/Plugins/Local/Frontend/CheckoutUtils/Components/CheckoutUtils/CheckoutUtils.php:161 1.3247 30243552 24. sAdmin-\>sGetUserData() /data/www/acme/engine/Shopware/Plugins/Local/Frontend/CheckoutUtils/Components/CheckoutUtils/CheckoutUtils.php:70 1.3341 30257816 25. sAdmin-\>getUserShippingData() /data/www/acme/engine/core/class/sAdmin.php:2656 1.3406 30268664 26. sAdmin-\>sGetPaymentMeanById() /data/www/acme/engine/core/class/sAdmin.php:4643 1.3423 30273272 27. sBasket-\>sGetBasket() /data/www/acme/engine/core/class/sAdmin.php:400 1.3629 30283960 28. sBasket-\>getBasketArticles() /data/www/acme/engine/core/class/sBasket.php:1027 1.3630 30291008 29. sArticles-\>sGetProductByOrdernumber() /data/www/acme/engine/core/class/sBasket.php:1920 1.3739 30328424 30. Enlight\_Event\_EventManager-\>filter() /data/www/acme/engine/core/class/sArticles.php:3682 1.3757 30477888 31. Enlight\_Event\_Handler\_Plugin-\>execute() /data/www/acme/engine/Library/Enlight/Event/EventManager.php:301 1.3758 30477984 32. Shopware\_Plugins\_Frontend\_CheckoutFirewall\_Bootstrap-\>sGetProductByOrdernumber\_FilterResult() /data/www/acme/engine/Library/Enlight/Event/Handler/Plugin.php:149 1.3759 30494616 33. Shopware\_Plugins\_Frontend\_CheckoutFirewall\_Bootstrap-\>processArticle() /data/www/acme/engine/Shopware/Plugins/Local/Frontend/CheckoutFirewall/Bootstrap.php:799 1.3768 30495024 34. Shopware\_Components\_CheckoutUtils\_Client-\>getDispatches() /data/www/acme/engine/Shopware/Plugins/Local/Frontend/CheckoutFirewall/Bootstrap.php:279 1.3768 30495024 35. Shopware\_Components\_CheckoutUtils\_Client-\>getSelectedCountry() /data/www/acme/engine/Shopware/Plugins/Local/Frontend/CheckoutUtils/Components/CheckoutUtils/CheckoutUtils.php:94 1.3768 30495024 36. Shopware\_Components\_CheckoutUtils\_Client-\>getSelectedShipping() /data/www/acme/engine/Shopware/Plugins/Local/Frontend/CheckoutUtils/Components/CheckoutUtils/CheckoutUtils.php:170 1.3768 30495024 37. Shopware\_Components\_CheckoutUtils\_Client-\>getUserData() /data/www/acme/engine/Shopware/Plugins/Local/Frontend/CheckoutUtils/Components/CheckoutUtils/CheckoutUtils.php:161 1.3769 30495024 38. sAdmin-\>sGetUserData() /data/www/acme/engine/Shopware/Plugins/Local/Frontend/CheckoutUtils/Components/CheckoutUtils/CheckoutUtils.php:70 1.3862 30509240 39. sAdmin-\>getUserShippingData() /data/www/acme/engine/core/class/sAdmin.php:2656 1.3916 30520232 40. sAdmin-\>sGetPaymentMeanById() /data/www/acme/engine/core/class/sAdmin.php:4643 1.3932 30524832 41. sBasket-\>sGetBasket() /data/www/acme/engine/core/class/sAdmin.php:400 1.4103 30535552 42. sBasket-\>getBasketArticles() /data/www/acme/engine/core/class/sBasket.php:1027 1.4104 30542600 43. sArticles-\>sGetProductByOrdernumber() /data/www/acme/engine/core/class/sBasket.php:1920 1.4196 30580032 44. Enlight\_Event\_EventManager-\>filter() /data/www/acme/engine/core/class/sArticles.php:3682 1.4211 30598512 45. Enlight\_Event\_Handler\_Plugin-\>execute() /data/www/acme/engine/Library/Enlight/Event/EventManager.php:301 1.4211 30598608 46. Shopware\_Plugins\_Frontend\_CheckoutFirewall\_Bootstrap-\>sGetProductByOrdernumber\_FilterResult() /data/www/acme/engine/Library/Enlight/Event/Handler/Plugin.php:149

Ja, das Problem wird wohl duch dieses Plugin verursacht: „CheckoutFirewall“ Baue mal bei dir im Plugin die genannten „bösen“ Methoden aus und ersetzte die durch weniger mächtige Funktionen. Beispiel: $view->sUserData statt sAdmin->sGetUserData() Und: $view->sBasket oder Basket->sBASKET statt Basket->sGetBasket() Heiner

Hallo, dass ist uns natürlich klar, dass der Eventloop durch unser Plugin generiert wird. Jedoch auch nur weil wir eben auf sAdmin->getUserData() zugreifen. Das wird aber jedes Plugin betreffen, welches auf ein Event horcht, dass sAdmin->getUserData() ausgelöst wird und dort wiederum die Userdaten abfragt. Woher ich in einen Event nun die $view-Variable bekomme, ist mir leider gerade unklar, bin recht kurzfristig erst zu den Projekt dazugekommen, und muss mich erst in alles einarbeiten… Btw. das mit den sGetBasket ist eine Codeänderung in der sAdmin.php selbst, die eben beim Update nun den Eventloop auslöst.

Hi, die schnellste Lösung für dich wäre mMn eine „Gate-Condition“ in deinem Callback, mit der du sicher stellst, dass dein Callback nicht erneut ausgeführt wird, solange der Callback nicht abgearbeitet wurde. Alternativ könntest du die nötigen Nutzerdaten anders ermitteln (also auf die getUserData verzichten) - wenn du an die View nicht sauber ran kommst, ist es ja auch nicht verboten, ein SQL-Query auszuführen. Vielleicht findest du auch ein „besseres“ Event, das das Problem nicht hat. Da wir über ein Update über mehrere Versionen hinweg sprechen, halte ich es für unwahrscheinlich, dass da von uns eine Korrektur in Form eines Releases kommt - die Änderung könnte ja theoretisch schon seit einem Jahr drin sein. Auch ist zumindest mir bisher kein anderer Fall bekannt, wo das Problem so auftritt. Grundsätzlich versuchen wir sowas natürlich zu vermeiden, weil es für Plugin-Entwickler immer ärgerlich ist. In einem lebendigen Softwareprodukt ist es aber teilweise auch unvermeidbar und - wie in deinem Fall - auch gut anderweitig lösbar. Besten Gruß, Daniel

[quote=“Daniel Nögel”] die schnellste Lösung für dich wäre mMn eine “Gate-Condition” in deinem Callback, mit der du sicher stellst, dass dein Callback nicht erneut ausgeführt wird, solange der Callback nicht abgearbeitet wurde. [/quote] Dürfte wahrscheinlich die beste Lösung sein. Mal ausprobieren. [quote=“Daniel Nögel”] Da wir über ein Update über mehrere Versionen hinweg sprechen, halte ich es für unwahrscheinlich, dass da von uns eine Korrektur in Form eines Releases kommt - die Änderung könnte ja theoretisch schon seit einem Jahr drin sein. Auch ist zumindest mir bisher kein anderer Fall bekannt, wo das Problem so auftritt. [/quote] Dacht ich mir, daher eher ein Beitrag hier, anstatt ein Report im Jira :slight_smile: [quote=“Daniel Nögel”] Grundsätzlich versuchen wir sowas natürlich zu vermeiden, weil es für Plugin-Entwickler immer ärgerlich ist. In einem lebendigen Softwareprodukt ist es aber teilweise auch unvermeidbar und - wie in deinem Fall - auch gut anderweitig lösbar. [/quote] Wie bei uns, ein Shopware-Projekt, dass seit zu langer Zeit gewachsen ist und durch zu viele Entwickler ging, die schon lange nicht mehr bei uns sind ^^

Nun gut, wir haben jetzt manuelle Statements eingebaut um nur die paar Punkte zu erhalten, die wir brauchen. Ändert trotzdem nichts daran, das Events in solch allgemeinen Methoden der Core-Klassen für Loops gefährdet sind. Schade das die Core-Klassen zwar deprecated sind, aber nicht aus der 5er rausgeflogen…