Wie Tags für DI-Container in eigenen Services abbilden?

Hallo,

aktuell definieren wir eigene Services per “Enlight_Bootstrap_InitResource_MEIN_SERVICE” Event. Nun wollen wir eine Erweiterung am Suchservice vornehmen, in der wir zum Beispiel eigene Sortierkriterien hinzufügen wollen. Da wir aber keine Tags auf eigenen Services setzen können gestaltet sich das schwierig. Wie kann man das Problem lösen, ohne die service.xml anzupassen?

 

Grüße

BTW:

engine/Shopware/Kernel.php:482 scheint eine Antwort auf das Problem zu haben.

Folgende Datei kann für eigene Services verwendet werden:

Components/DependencyInjection/services_local.xml

 

Gibt es da eventuell noch eine schönere Möglichkeit?

 

Grüße

Hi,

hilft dir das Dokument schon weiter? Service extensions

Da wird beschrieben, wie du eigene Services erzeugst und bestehende dekorierst. Wenn du die StoreFront-Geschichtern erweitern möchtest (eigene Kriterien), könnt dir diese Doku weiter helfen: SearchBundle

Der Code-Generator erzeugt dir auch entsprechende Beispiele: Generating plugins with the CLI tools

Daniel

Danke für die ausführliche Antwort. Denke das hilft mir für diesen konkreten Fall weiter.

 

Wäre es technisch grundsätzlich von Euerer Seite aus möglich auf Bundle-Ebene eigene Service-Definitions Dateien zu haben (service.xml) oder geht das aufgrund der Reihenfolge der Initialisierung nicht?

Hi, 

momentan geht das leider nur über das Eventsystem und die service_local. Wir sind aber bereits in der Konzeption für Möglichkeiten, die sich mehr an Bundes orientieren. Aber es gibt noch nichts Verwendbares. Als Möglichkeit für jetztige Plugins habe ich mal meinen „lazy subscriber“ vorgeschlagen, vgl Best practices of Shopware plugin development. Damit kannst du Servicedefinitionen etwas sauberer abbilden. Vom Prinzip her brauchst du mein Library dafür auch gar nicht einbinden, sondern kannst dir einfach einen Subscriber erzeugen, der diese Mechanik für sich implementiert.

Daniel 

1 Like

Wie gehe ich vor, wenn ich z.B. den Elastic-Search ProductProvider für den Indexer erweitern / ersetzen möchte? Da ich hier auch Deinen LazySubscriber verwende, stoße ich hier gerade an das Problem den Subscriber beim Starten der Console zu registrieren (Shopware_Console_Add_Command?).

Ich baue eine Decorator für den ProductProvider, allerdings ist der Service “shopware_elastic_search.product_provider” zu diesem Zeitpunkt null (weil noch nicht geladen?).

            ‘shopware_elastic_search.product_provider’ => function (Container $container) {
                $productProvider = $container->get(‘shopware_elastic_search.product_provider’);
                return new \XX\ProductProviderDecorator(
                    $productProvider, $container->get(‘models’)
                );
            }

Hast Du / Ihr dafür eine Idee?

Hi,

beim Dekorieren musst du leider noch die Standard-Events verwenden, siehe hier: Service extensions

        $this->subscribeEvent(
            'Enlight_Bootstrap_AfterInitResource_SERVICE_DEN_DU_DEKORIEREN_WILLST',
            'registerService',
            500
        );

Theoretisch könnte man den LazySubscriber auch noch so abändern, dass der auch das „AfterInitResource“ unterstützt - aber momentan ist das nicht so, von daher musst du das o.g. Event registrieren / in deinem Sinne abändern. Wie gesagt: Das wird in Zukunft noch einfacher :slight_smile:

Daniel