есть такая сущность продукта:
/**
* Class Product.
*
* @DoctrineAssert\UniqueEntity("itemNumber")
*
*/
class Product
{
/**
* @ORM\Column(type = "string", length=64, unique=true)
*/
private $itemNumber;
.
.
.
Но в некоторых случаях я хочу переопределить это «уникальное» поведение. Мне нужно это переопределение на уровне формы. На уровне базы данных следует сохранить уникальное поведение. Я хотел бы добиться того, чтобы с помощью события формы номер статьи получил префикс. Что-то вроде этого:
/**
* Class BaseProductEventListener.
*/
class ProductCreateListener
{
/**
* @param LifecycleEventArgs $eventArgs
*/
public function prePersist(LifecycleEventArgs $eventArgs)
{
$entity = $eventArgs->getObject();
if (!$entity instanceof Product) {
return;
}
if (!$entity->getCategories() instanceof ArrayCollection) {
return;
}
if (isset($entity->getCategories()[0])) {
$firstCat = $entity->getCategories()[0];
if ($firstCat->getNameSlug() == 'my_nameslug') {
$entity->setItemNumber('my_prefix_'.$entity->getItemNumber());
}
}
}
}
Итак, если у моего продукта есть определенная категория, номер позиции получит префикс на уровне базы данных.
Проблема в том, что мое событие сработает ПОСЛЕ утверждения сущности: @DoctrineAssert \ UniqueEntity ("itemNumber")
Как я могу изменить это так, чтобы мое событие сначала меняло номер статьи, а утверждение сущности проверялось позже в форме?






Если вам это нужно на уровне формы, вы всегда можете добавить прослушиватель событий формы. Пример:
->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
$form = $event->getForm();
$data = $event->getData();
//// your logic here ...
})
Это перехватывает данные перед их отправкой формой, задолго до события Doctrine persist.
События формы документы здесь.