<?php declare(strict_types=1);
namespace Shopware\Core\Checkout\Customer\Subscriber;
use Shopware\Core\Checkout\Customer\CustomerDefinition;
use Shopware\Core\Checkout\Customer\Event\CustomerDeletedEvent;
use Shopware\Core\Framework\Api\Context\SalesChannelApiSource;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
use Shopware\Core\Framework\DataAbstractionLayer\Event\BeforeDeleteEvent;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\Util\Random;
use Shopware\Core\System\SalesChannel\Context\SalesChannelContextServiceInterface;
use Shopware\Core\System\SalesChannel\Context\SalesChannelContextServiceParameters;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class CustomerBeforeDeleteSubscriber implements EventSubscriberInterface
{
private EntityRepositoryInterface $customerRepository;
private SalesChannelContextServiceInterface $salesChannelContextService;
private EventDispatcherInterface $eventDispatcher;
/**
* @internal
*/
public function __construct(
EntityRepositoryInterface $customerRepository,
SalesChannelContextServiceInterface $salesChannelContextService,
EventDispatcherInterface $eventDispatcher
) {
$this->customerRepository = $customerRepository;
$this->salesChannelContextService = $salesChannelContextService;
$this->eventDispatcher = $eventDispatcher;
}
/**
* @return array<string, string>
*/
public static function getSubscribedEvents()
{
return [
BeforeDeleteEvent::class => 'beforeDelete',
];
}
public function beforeDelete(BeforeDeleteEvent $event): void
{
$context = $event->getContext();
$ids = $event->getIds(CustomerDefinition::ENTITY_NAME);
if (empty($ids)) {
return;
}
$source = $context->getSource();
$salesChannelId = null;
if ($source instanceof SalesChannelApiSource) {
$salesChannelId = $source->getSalesChannelId();
}
$customers = $this->customerRepository->search(new Criteria($ids), $context);
$event->addSuccess(function () use ($customers, $context, $salesChannelId): void {
foreach ($customers->getElements() as $customer) {
$salesChannelContext = $this->salesChannelContextService->get(
new SalesChannelContextServiceParameters(
$salesChannelId ?? $customer->getSalesChannelId(),
Random::getAlphanumericString(32),
$customer->getLanguageId(),
null,
null,
$context,
)
);
$this->eventDispatcher->dispatch(new CustomerDeletedEvent($salesChannelContext, $customer));
}
});
}
}