<?php
declare(strict_types=1);
namespace App\EventSubscriber;
use Setono\SyliusRedirectPlugin\Model\Redirect;
use Setono\SyliusRedirectPlugin\Repository\RedirectRepositoryInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
final class TaxonRedirectSubscriber implements EventSubscriberInterface
{
public function __construct(
private RedirectRepositoryInterface $redirectRepository
) {
}
public static function getSubscribedEvents(): array
{
return [
FormEvents::POST_SUBMIT => 'onPostSubmit',
];
}
public function onPostSubmit(FormEvent $event): void
{
$form = $event->getForm();
$taxon = $event->getData();
if (null === $taxon || !$form->has('original_slug')) {
return;
}
$originalSlug = $form->get('original_slug')->getData();
$newSlug = $taxon->getTranslation('en_US')->getSlug();
$originalSlug = is_string($originalSlug) ? trim($originalSlug) : null;
$newSlug = is_string($newSlug) ? trim($newSlug) : null;
if (!$originalSlug || !$newSlug || $originalSlug === $newSlug) {
return;
}
$source = '/' . $originalSlug;
$destination = '/' . $newSlug;
$existingRedirect = $this->redirectRepository->findOneBy(['source' => $source]);
if (null !== $existingRedirect) {
return;
}
$redirect = new Redirect();
$redirect->setSource($source);
$redirect->setDestination($destination);
$redirect->setPermanent(true);
$redirect->setEnabled(true);
$redirect->setOnly404(false);
$this->redirectRepository->add($redirect);
}
}