У меня довольно простая сущность с проверкой UniqueEntity:
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;
use Doctrine\ORM\Mapping\ManyToOne;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Doctrine\ORM\Mapping\HasLifecycleCallbacks;
/**
* @ORM\Entity(repositoryClass="App\Repository\UserRepository")
* @UniqueEntity("email", message="Email already in use")
*
*
*/
class User implements UserInterface
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=180, unique=true)
*/
private $email;
Форма (сознательно удалены все остальные поля формы)
<?php
/**
* Created by PhpStorm.
* User: jochen
* Date: 18/12/18
* Time: 12:15 PM
*/
namespace App\Form;
use App\Entity\Company;
use App\Entity\User;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\CallbackTransformer;
use Symfony\Component\Form\ChoiceList\Loader\CallbackChoiceLoader;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
class UserType extends AbstractType
{
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add( 'email', EmailType::class,[
'label' => 'Email'
] );
$builder->add( 'save', SubmitType::class, [
'attr' => [
'class' => 'btn btn-primary',
'id' => 'btn-user-form'
],
'label' => 'Save'
] );
}
/**
* {@inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults( [
'data_class' => 'App\Entity\User'
]);
}
/**
* {@inheritdoc}
*/
public function getBlockPrefix()
{
return 'user';
}
}
и контроллер:
public function edit(User $user, RequestStack $request)
{
$em = $this->getDoctrine()->getManager();
$form = $this->createForm( UserType::class, $user);
$form->handleRequest($request->getCurrentRequest());
if ($form->isSubmitted() && $form->isValid()){
$em->persist( $user);
$em->flush();
$this->addFlash('success', 'User updated.');
return $this->redirectToRoute('user_index');
}
return $this->render('user/update.html.twig', [
'form' => $form->createView(),
'deleteForm' => $this->createDeleteForm($user)->createView()
]);
}
Когда я сохраняю существующую запись, я получаю сообщение об ошибке «Электронная почта уже используется» (как указано мной)
Конечно, он уже существует, но в той же записи. Я должен использовать разные объекты для вставки и обновления или как UniqueEntity предназначен для использования?
Symfony 4.2