現在、私はSymfony v3.3.6プロジェクトに取り組んでいます。 私はユーザー作成のためのフォームを持っています。 電子メールとユーザー名(fosユーザーバンドルの)が一意であることを確認したいと思います。Symfony - ユニークなエンティティの制約が機能しません。
私は現在、このモデル(少しだけ部分)所有:あなたはまた、それぞれに「NotBlank」制約で、ユーザ名と電子メールのために、私は2 'ユニークなエンティティの属性を追加して見ることができるように
<?php
namespace ProjectBundle\Entity\User;
use Doctrine\ORM\Mapping as ORM;
use FOS\UserBundle\Model\User as BaseUser;
use Gedmo\Mapping\Annotation as Gedmo;
use Gedmo\SoftDeleteable\Traits\SoftDeleteableEntity;
use Gedmo\Timestampable\Traits\TimestampableEntity;
use ProjectBundle\Entity\Gender\Gender;
use ProjectBundle\Entity\Organisation\Organisation;
use ProjectBundle\Entity\Traits\BlameableEntity;
use ProjectBundle\Entity\User\Profile;
use Symfony\Component\Security\Core\User\AdvancedUserInterface;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntityValidator;
/**
* @ORM\Entity(repositoryClass="ProjectBundle\Repository\User\UserRepository")
* @Gedmo\SoftDeleteable(fieldName="deletedAt")
* @ORM\Entity
* @UniqueEntity(fields={"email"}, groups={"registration"})
* @UniqueEntity(fields={"username"}, groups={"registration"})
* @ORM\Table(name="user")
*/
class User extends BaseUser implements AdvancedUserInterface, \Serializable
{
use TimestampableEntity;
use SoftDeleteableEntity;
use BlameableEntity;
const ID_ORGA_GC = 1;
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @Assert\NotBlank()
*/
protected $username;
/**
* @Assert\NotBlank(groups={"registration"})
* @Assert\Length(groups={"registration"},
* min = 2,
* max = 254,
* minMessage = "Votre mot de passe doit comporter au minimum {{ limit }} caractères.",
* maxMessage = "Votre mot de passe doit comporter au maximum {{ limit }} caractères."
*)
*
* @var string
*/
protected $plainPassword;
/**
* @Assert\NotBlank()
* @Assert\Email(
* message = "L'adresse mail '{{ value }}' n'est pas valide.",
* checkMX = true
*)
*
* @var string
*/
protected $email;
を。私のコントローラで
は、私は自分のフォームを呼び出す:
$form = $this->createForm('ProjectBundle\Form\User\UserType', $entity,array('organisation' => $organisations, 'validation_groups' => array('Default','registration')));
$form->handleRequest($request);
if ($form->isSubmitted()) {
if ($form->isValid()) {
しかし、私はすでに存在している電子メールアドレスを書く場合でも、私は状態に入り、時間がフラッシュIのために来るとき大きなSQLエラーを取得:
SQLSTATE [23000]: Integrity constraint violation: 1062 Duplicate entry '[email protected]' for key 'UNIQ_8D93D649A0D96FBF'
しかし、興味深い発言は「NotBlank」制約が正常に動作することで、私の見解で私を示し「の値が空にすることはできません」
をここにあります私の形式:
class UserType extends AbstractType
{
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('lastname',null,array('required' => true))
->add('firstname')
->add('gender',null,array('required'=>true))
->add('organisationMember',null,array(
'required' => true,
'choices' => $options['organisation'],
'group_by' => 'type_organisation',
'placeholder' => 'Choisissez votre organisation'
))
->add('job')
->add('lang', null, array(
'required' => true
))
->add('mobile',null, array(
'required' => false
))
->add('phone', null, array(
'required' => true
))
->add('enabled')
->add('is_external')
->add('alert_failure')
->add('alert_full')
->add('alert_other')
->add('plainPassword', TextType::class, array('required' => false))
->add('email')
->add('profile', null, array(
'required' => true,
'placeholder' => 'Choose an organisation !',
));
}
/**
* {@inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'ProjectBundle\Entity\User\User',
'organisation' => 'ProjectBundle\Entity\Organisation\Organisation',
'profiles' => 'ProjectBundle\Entity\User\Profile',
'csrf' => true,
));
}
}
誰かが解決策を持っている場合。
ありがとうございます!
/**
* @ORM\Entity(repositoryClass="ProjectBundle\Repository\User\UserRepository")
* @Gedmo\SoftDeleteable(fieldName="deletedAt")
* @ORM\Entity
* @UniqueEntity(fields={"email", "username"}, groups={"registration"})
* @ORM\Table(name="user")
*/
しかし、あなたは、電子メールとユーザー名の一意のインデックスを持っていることを確認してください。
[Doctrine 2 @Gedmo \ SoftDeleteableと固有のフィールド]の複製が可能です(https://stackoverflow.com/questions/33533761/doctrine-2-gedmo-softdeleteable-and-unique-fields) –
エラーはほとんど同じですしかし、提案されたソリューションが動作しない、私はまだSQLの例外があります。 –