Plugin:Namespace von eigenen Helper-Klassen unter Components

Hi! Ich bin jetzt mit Shopware eingestiegen und ich wollte kurz nach einer Sache hören, ob das so best-practice ist - ich finde leider weder in den Tutorials noch hier im Forum was über das Thema. Der Hintergrund: Ich möchte in der Bootstrap keine große Logik haben, und die lieber in meine eigene Klassen auslagern. Ich möchte auf endloses requiren verzichten, aber auch keine eigene Logik für das autoloaden implementieren. Ich habe gesehen, dass eigene Models in der private function afterInit() über $this-\>registerCustomModels(); registriert werden können. Wenn die Klassen dann im Plugin unter Models/PluginName/ liegen mit dem namespace Shopware\CustomModels\PluginName können die verwendet werden. Jetzt möchte ich aber keine eigenen Models, sondern Components benutzen. Mein Weg ist deswegen aktuell: In der private function afterInit() mit $this-\>Application()-\>Loader()-\>registerNamespace( 'Shopware\_Components', $this-\>Path() . 'Components/' ); meinen Ordner unter Plugin/Components/PluginName registrieren, und die Klassen nach dem Schema Shopware_Components_PluginName_Unterordner_Klassenname Ich kann meine Klassen aufrufen, aber diese stehen dann ja im globalen Shopware-Namespace. Meine Frage deswegen, ob dass irgendwelche Auswirkungen das haben könnte bzw. ob das so überhaupt schick ist (im Plugin-Namen gebe ich auch ein Präfix an). Ich habe auch probiert dort einen eigenen namespace anzugeben, jedoch ohne Erfolg. Gibt es alternativen, oder ist Prinzip so in Ordnung? Freue mich über Feedback :slight_smile: Niklas

Beschäftige mich momentan auch mit diesem Thema, ein Best Practice wäre gut.

Ich verstehe das Problem nicht so ganz. Wieso brauchst du require oder musst eigene autoloader schreiben? Namespace registrieren: $this-\>Application()-\>Loader()-\>registerNamespace( 'Shopware\DeinPlugin', $this-\>Path() . "Components/" ); Deine Verzeichnisstruktur Components - Komponente.php Bootstrap.php Deine Komponente.php namespace Shopware\DeinPlugin class Komponente { public function test() { } } Aufrufen mit: $obj = new \Shopware\DeinPlugin\Komponente(); $obj-\>test(); Viele Grüße

1 „Gefällt mir“

Sehr schön aufgelistet, Aquatuning! Hatte lustigerweise vor ein paar Tagen fast ein identisches Beispiel unter http://forum.shopware.com/post101939.html#p101939 notiert, falls es noch anderen Lesern helfen könnte. Schöne Grüße, Niklas

1 „Gefällt mir“

Vielen Dank :wink: Hat alles super funktioniert. Das einzige Problem was ich noch habe: Wenn man ein Cronjob erstellt, wird er bei dem ersten Aufruf zerschossen (false und stellt sich auf inaktiv). Beim erneuten aktivieren und ausführen läuft dieser ohne Probleme durch. Kann dies an folgender Methode liegen? public function afterInit() { $this-\>Application()-\>Loader()-\>registerNamespace( 'Shopware\Components', $this-\>Path() . 'Components/' ); }

Endet dein cronjob mit return true? Ansonsten müsste die Fehlermeldung einsehbar sein. Viele Grüße

Ja, er endet wie folgt: public function onXXXRun(Shopware\_Components\_Cron\_CronJob $job) { new \Shopware\SWINSynchronisation\Components\viewXXX(); return true; } Wenn ich das „return true“ auskommentiere, sehe ich trotzdem keinen Fehler. Auf der lokalen Umgebung (desplay errors: on) wird ebenfalls nichts angezeigt. Kann es sein das die Namespaces noch nicht registriert sind? Wobei ich diese wie folgt gesetzt habe: public function afterInit() { $this-\>Application()-\>Loader()-\>registerNamespace( 'Shopware\SWINSynchronisation', $this-\>Path()); } Wobei dieser Code am Ende der Bootstrap ist, was eigentlich egal sein müsste.