[Kontaktformular] Decorating MailService

Tach zusammen,

das Kontaktformular macht seine Arbeit. Allerdings ist der Absender immer ich.
D.H., wenn ich auf eine Anfrage antworte (Mailprogramm Antworten), dann schreib ich mir selbst eine E-Mail.
Ich bin also gezwungen den Empfänger anzupassen:

  • E-Mail Adresse aus dem Text suchen
  • Copy/Past Empfänger
    Das empfinde ich als unnötige Schritte.

In Shopware\Core\Content\MailTemplate\Service\MailService wird folgendes als Absender festgelegt:

[120] $senderEmail = $this->systemConfigService->get('core.basicInformation.email', $salesChannelId);

[122] $senderEmail = $senderEmail ?? $this->systemConfigService->get('core.mailerSettings.senderAddress');

Also irgendeine Adresse die ich konfiguriert habe.

Nun wollte ich den MailService dekorieren und muss feststellen, dass das nicht geht:

Argument 1 passed to Shopware\Core\Content\MailTemplate\Subscriber\MailSendSubscriber::__construct() must be an instance of Shopware\Core\Content\MailTemplate\Service\MailService, instance of MyPlg\Core\Content\MailTemplate\Service\MailService given, called in /var/www/var/cache/dev_h8024e86b1aab233559f2d7b50ee43088/ContainerNhPDC6d/srcShopware_Production_KernelDevDebugContainer.php on line 14410

Ich vermute mal, dass es an den fehlenden Interface liegen könnte. MailService ist einfach nur eine Klasse ohne Interface.

Hat jemand nen Tipp für mich, wie ich das umgehen kann?

Hi,

ja ist richtig liegt am fehlenden Interface. Aber Du könntest die service id “Shopware\Core\Content\MailTemplate\Service\MailService” im Container mit Deiner eigenen überschreiben. Müsstest dafür in Deiner Plugin Klasse eine build Funktion einbauen. Ähnlich wie beim FroshDevelopmentHepler

public function build(ContainerBuilder $container): void
    {
        $container->addCompilerPass(new DisableTwigCacheCompilerPass());
        $container->addCompilerPass(new CustomProfilerExtensions());
        $container->addCompilerPass(new BuildEntityDefinitionNamesCompilerPass());
        parent::build($container);
    }

Könntest dann theoretisch eine Klasse mit dem Shopware Mailservice als Parent erstellen, müsstest nur die private Funktionen (da diese nicht ans Child vererbt werden) mitaufnehmen, und die gewünschte Funktion anpassen.

Noch besser wäre es wenn du ihn trotzdem dekorierst aber von der Shopware Klasse ableitest. Und dann ihn so verwendest als hättest du ein Interface.

danke euch beiden.

ich hab den service nun überschrieben:

und die von der Klasse abegleitet:

class MailService extends BaseMailService {
...
}

die ganzen privaten methoden und variablen hab ich also komplett übernommen.

btw. Mit 6.2 wird alles besser. Dank PullRequests. Es gibt dort Interfaces und neue Events.