Decorate Service - altes und neues Pluginsystem

Hallo Community,

ich habe ein Problem mit “Decorating Services”. Ich habe ein eigenes Plugin und ein verschlüsseltes Plugin aus dem Store. Mein eigenes Plugin ist noch mit dem alten Pluginsystem erstellt, das Plugin aus dem Store im neuen System.

In meinem Plugin habe ich das Event mit

$this->subscribeEvent('Enlight_Bootstrap_AfterInitResource_shopware_storefront.list_product_service','decorateService');

registriert und

/**
* decorate Service
*/
public function decorateService()
{
   $coreService = Shopware()->Container()->get('shopware_storefront.list_product_service');
   $mtwService = new MtwProductService($coreService);
   Shopware()->Container()->set('shopware_storefront.list_product_service', $mtwService);
}

den Service dekoriert.

Der Pluginhersteller behauptet er habe das selbe in seinem Plugin auch gemacht. Leider funktioniert es nicht. Meine Änderungen sind mit Aktivierung beider Plugins nicht mehr sichtbar. Muss ich mein Plugin in das neue Pluginsystem umschreiben? Funktioniert es dann? Meiner Meinung nach kommt es auf die Registrierung des Events an. Das System müsste doch egal sein, oder?

Viele Grüße

Mathias

Hi,

vom Prinzip her sieht es richtig aus. Allerdings ist ja auch die Frage, was in dem dekorierenden Services passiert. Wenn der andere Pluginhersteller bspw. die Methode des “inneren” Services nicht aufruft (das wärst in dem Beispiel du), würde dein Code ja auch nicht zur Geltung kommen, selbst wenn sonst alles richtig ist. 

Daniel

1 „Gefällt mir“

Hallo Daniel,

vielen Dank für deine schnelle Antwort.

Ich verstehe es noch nicht.

Mein Konstruktur und meine getList-Funktion sehen so aus:

/**
 * @param ListProductServiceInterface $service
 */
public function __construct(ListProductServiceInterface $service)
{
    $this->service = $service;
    $this->connection = Shopware()->Container()->get('dbal_connection');
}


/**
 * @inheritdoc
 */
public function getList(array $numbers, Struct\ProductContextInterface $context)
{
    $products = $this->service->getList($numbers, $context);
    /**@var $product Struct\ListProduct*/
    foreach ($products as &$product) {
        //hier werden Attribute dran gehängt
    }
    return $products;
}

Wie und wo rufe ich die Methode des “inneren” Services auf? Da das Plugin verschlüsselt ist, kenne ich doch gar nicht die Methoden und den Klassennamen.

Grüße

Mathias

Moin @mbdus‍,

den „inneren“ Service rufst du schon ganz korrekt mit $this->service->getList($numbers, $context); aus.
Das ist quasi wie ein Parent-Call zu verstehen.

Nun kann es aber sein, dass das Plugin aus dem Store eben dies nicht aufruft - somit würde der „Parent“ nicht ausgeführt werden. Das bist in diesem Fall du mit deinem eigenen Plugin.
Auch der Core-Service von Shopware würde so komplett überschrieben werden.

Gruß,
Patrick  Shopware

1 „Gefällt mir“

Danke, ich wende mich nochmals an den Pluginhersteller.

Grüße

Mathias