Backend service and controller for converting piece categories to component categories (and vice-versa). Uses raw SQL in a transaction to preserve IDs and transfer all related data (documents, custom fields, constructeurs). Includes php-cs-fixer formatting pass on existing controllers/entities. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
51 lines
1.4 KiB
PHP
51 lines
1.4 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\EventSubscriber;
|
|
|
|
use Doctrine\DBAL\Exception\UniqueConstraintViolationException;
|
|
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
|
|
use Symfony\Component\HttpFoundation\JsonResponse;
|
|
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
|
|
use Symfony\Component\HttpKernel\KernelEvents;
|
|
use Throwable;
|
|
|
|
final class UniqueConstraintSubscriber implements EventSubscriberInterface
|
|
{
|
|
public static function getSubscribedEvents(): array
|
|
{
|
|
return [
|
|
KernelEvents::EXCEPTION => 'onKernelException',
|
|
];
|
|
}
|
|
|
|
public function onKernelException(ExceptionEvent $event): void
|
|
{
|
|
$exception = $this->findUniqueConstraintViolation($event->getThrowable());
|
|
|
|
if (!$exception) {
|
|
return;
|
|
}
|
|
|
|
$event->setResponse(new JsonResponse(
|
|
[
|
|
'success' => false,
|
|
'error' => 'nom duplique',
|
|
],
|
|
JsonResponse::HTTP_CONFLICT
|
|
));
|
|
}
|
|
|
|
private function findUniqueConstraintViolation(Throwable $throwable): ?UniqueConstraintViolationException
|
|
{
|
|
for ($current = $throwable; null !== $current; $current = $current->getPrevious()) {
|
|
if ($current instanceof UniqueConstraintViolationException) {
|
|
return $current;
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
}
|