Hallo, mitten im laufenden Betrieb vermeldete ein Plugin folgende Errormeldung:
Class "WtCustomerRegistration\Subscriber\CustomerRegistration" used for service "WtCustomerRegistration
\Subscriber\CustomerRegistration" cannot be found.
Es lief bereits mit folgender Konfiguration:
composer.json:
<?php declare(strict_types=1);
namespace WtCustomerRegistration\Subscriber;
use Symfony\Component\HttpFoundation\Response;
use Shopware\Core\Checkout\Customer\Event\CustomerRegisterEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use WtCustomerRegistration\Service\Mailer;
use WtCustomerRegistration\Service\ContactDatabase;
use DateTime;
use DateInterval;
use Throwable;
/**
*
*/
class CustomerRegistration implements EventSubscriberInterface
{
...
}
Es ist eine 1:1 Kopie meines lokalen Entwicklungsservers, wo alles famos läuft. Wie kommt es zu dieser Fehlermeldung?
Was auch immer der Grund war, ich habe es jetzt gefixt, indem ich einfach meine funktionierende Entwicklungsversion wieder hochgeladen habe. Der Error ist weg.
Allerdings wurde in der Shopware6.3 Version noch ein Interface und eine Mailer Klasse verwendet. Ab Shopware6.5 gibt es kein Mail Interface mehr. Meine services.xml hat sich nicht verändert. Ich frage mich allerdings, was ich jetzt über eine DPI einlesen soll: Das Interface oder die Klasse, also so:
<?php
namespace WtCustomerRegistration\Service;
use Shopware\Core\Content\MailTemplate\Service\**MailService**;
use Shopware\Core\System\SalesChannel\SalesChannelContext;
use Symfony\Component\HttpFoundation\ParameterBag;
use DateTime;
use DateInterval;
use Exception;
class Mailer
{
private **MailService** $mailService;
public function __construct(**MailService** $mailService)
{
$this->mailService = $mailService;
}
/**
* @param SalesChannelContext $salesChannelContext
* @param string $subject
* @param string $content
* @param array $recipients
* @return bool
*/
public function sendMail(SalesChannelContext $salesChannelContext, string $subject, string $content, array $recipients): bool
{
...
}
oder so:
<?php
namespace WtCustomerRegistration\Service;
use Shopware\Core\Content\MailTemplate\Service\**MailServiceInterface**;
use Shopware\Core\System\SalesChannel\SalesChannelContext;
use Symfony\Component\HttpFoundation\ParameterBag;
use DateTime;
use DateInterval;
use Exception;
class Mailer
{
private **MailServiceInterface** $mailService;
public function __construct(**MailServiceInterface** $mailService)
{
$this->mailService = $mailService;
}
/**
* @param SalesChannelContext $salesChannelContext
* @param string $subject
* @param string $content
* @param array $recipients
* @return bool
*/
public function sendMail(SalesChannelContext $salesChannelContext, string $subject, string $content, array $recipients): bool
{
...
}
Diese Klasse implementiert die Versandmethode nicht. Genau so wenig wie das Interface. Sollte man nicht diejenige Klassse verwenden, die die Versandmethode implementiert?
Die für die DI, da kann man ja schauen, wie Shopware das macht. Im 6.5 ist das in vendor/shopware/storefront/DependencyInjection, ich meine im 6.3 war es aber noch woanders.