Service eines anderen Plugins replacen/decoraten

Hallo,

 

Ich möchte gerne Services eines anderen Plugins in meinem eigenen Plugin replacen/decoraten.

Orientiert habe ich mich dabei an folgender Anleitung: Service extensions

Allerdings scheint dies nicht für das Erweitern eines Plugin-Services zu funktionieren.

 

Als Beispiel nehme ich mal den Premium Plugin Advanced Promotion.

Im Container gibt es einen PercentageBasketHandler für den prozentualen Warenkorbrabatt.

 

In der Bootstrap versuche ich eine Replace Funktion wie folgt zu registrieren:

 

use MyPlugins\MyAdvancedPromotionArticlePrice\Components\Promotion\DiscountHandler\BasketHandler\MyPercentageBasketHandler;

[...]

public function install()
{
    $this->subscribeEvent(
        'Enlight_Bootstrap_InitResource_shopware_storefront.promotion.discount.basket.percentage',
        'replaceService',
        500
    );

    return true;
}


public function afterInit()
{
    /** @var Enlight_Loader $loader */
    $loader = $this->get('loader');

    $loader->registerNamespace(
        'MyPlugins\\MyAdvancedPromotionArticlePrice',
        $this->Path()
    );
}


public function replaceService()
    {
        return new MyPercentageBasketHandler();
    }

 

In meiner MyPercentageBasketHandler php habe ich die Standard-Methode drin und gebe testweise einen konstanten Amoun zurück - dieser wird allerdings nirgends übernommen bzw. das Registrieren der replaceService-Methode in der Bootstrap scheint schon nicht zu funktionieren:

 

amount / 100));
        return new DiscountCommand(10);
    }
}

 

Hat jemand eine Idee, wie man Services, die durch ein anderes Plugin registriert wurden, erweitern/replacen kann?

Hallo,

hilft dir das hier vielleicht?

https://developers.shopware.com/developers-guide/plugin-extension-by-plugin/

Moritz

@Moritz Naczenski schrieb:

Hallo,

hilft dir das hier vielleicht?

https://developers.shopware.com/developers-guide/plugin-extension-by-plugin/

Moritz

Also das Registrieren des neuen Services anhand des alten Services versuche ich ja genauso - nur halt mit dem alten Plugin System.

Liegt es am alten Plugin System? Oder ist beim Registrieren des Events schlicht das Event falsch?

Enlight_Bootstrap_InitResource_shopware_storefront.promotion.discount.basket.percentage

Ist dieses Event vielleicht falsch? 

Hallo DenKon26,

ich habe eine Frage, ist “DiscountHandler” ein Interface oder ein Class ??

Viele Grüße,

Ahmad

@ahmadsaad schrieb:

Hallo DenKon26,

ich habe eine Frage, ist „DiscountHandler“ ein Interface oder ein Class ??

Viele Grüße,

Ahmad

DiscountHandler ist ein Interface. Ich habe schon fast die Vermutung, dass das decoraten eines Services eines anderen Plugins nur mit dem neuen Plugin System geht…

Das ist mir jetzt sehr peinlich.

Das Problem saß mal wieder vor dem Rechner :-/

Ich hatte beim Klassennamen meines Services einen Buchstabendreher drin, wodurch mein Service nicht gefunden wurde und beim Replacen der Shop auf der Warenkorbseite einen 503 Error warf.