2017-10-18 17 views
0

現在、私は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") 
*/ 

しかし、あなたは、電子メールとユーザー名の一意のインデックスを持っていることを確認してください。

+0

[Doctrine 2 @Gedmo \ SoftDeleteableと固有のフィールド]の複製が可能です(https://stackoverflow.com/questions/33533761/doctrine-2-gedmo-softdeleteable-and-unique-fields) –

+0

エラーはほとんど同じですしかし、提案されたソリューションが動作しない、私はまだSQLの例外があります。 –

答えて

0

は、あなたがこのようにしようとしています。

+0

あなたのソリューションはDEVのみで動作します。 PRODへの変更を更新すると、例外はまだそこにあります。 (データベースは良好なインデックスで準備されています) –

0

現在のところ、@ CarcaBotの応答はDEVのみでしか動作しません。ファイルが同一である間にPRODの問題を変更しないでください。

アイデア?

関連する問題