2016-12-07 8 views
1

私を尊敬してください私はsymfonyで新しく、有効であればすでに存在するかどうかを検証したいと思います。ユーザーはフォームを送信してデータベースにデータを保存することができますが、問題はユーザーが重複した電子メールを同時に送信できることです。どうすればいいの?電子メールが有効かどうか、symfony 3.2に既に存在するかどうかを確認してください

namespace SwipeBundle\Controller\Backend; 

use SwipeBundle\Entity\Company; 

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\HttpFoundation\Request; 

use Symfony\Component\Form\Extension\Core\Type\TextType; 
use Symfony\Component\Form\Extension\Core\Type\MoneyType; 
use Symfony\Component\Form\Extension\Core\Type\TextareaType; 
use Symfony\Component\Form\Extension\Core\Type\EmailType; 
use Symfony\Component\Form\Extension\Core\Type\SubmitType; 
use Symfony\Component\Validator\Constraints\Email; 
use Symfony\Component\Validator\Constraints\EmailValidator; 

    public function addAction(Request $request) 
    { 
     $company = new Company; 

     $form = $this->createFormBuilder($company) 
      ->add('name', TextType::class) 
      ->add('prefund_wallet', TextType::class) 
      ->add('telephone_no', TextType::class) 
      ->add('mobile_no', TextType::class) 
      ->add('address', TextareaType::class) 
      ->add('email_address', EmailType::class) 
      ->add('website', TextType::class) 
      ->add('Submit', SubmitType::class) 
      ->getForm(); 


     $form->handleRequest($request); 

     if($form->isSubmitted() && $form->isValid()) 
     { 
      $name   = $form['name']->getData(); 
      $prefund_wallet = $form['prefund_wallet']->getData(); 
      $telephone_no = $form['telephone_no']->getData(); 
      $mobile_no  = $form['mobile_no']->getData(); 
      $address  = $form['address']->getData(); 
      $email_address = $form['email_address']->getData(); 
      $website  = $form['website']->getData(); 
      $ip    = $request->getClientIp(); 

      $now = new\DateTime('now'); 

      // Check if email is valid 
      $emailValidator = new EmailValidator(); 

      if(!$emailValidator->isValid($email_address, new Email())) 
      { 
       $form['email_address']->addError(new FormError('Invalid email')); 
      }   

      $company->setName($name); 
      $company->setPrefundWallet($prefund_wallet); 
      $company->setTelephoneNo($telephone_no); 
      $company->setMobileNo($mobile_no); 
      $company->setAddress($address); 
      $company->setEmailAddress($email_address); 
      $company->setRegistered($now); 
      $company->setIp($ip); 
      $company->setWebsite($website); 

      $em = $this->getDoctrine() 
       ->getManager(); 
      $em->persist($company); 
      $em->flush(); 

      $this->addFlash(
       'notice', 'Company has been added.' 
      ); 

      die("Redirected"); 
     } 

     return $this->render('Backend/Company/create.html.twig', array(
      'form' => $form->createView() 
     )); 
    } 
+0

だろう -

http://symfony.com/doc/current/reference/constraints/Email.html

を見て、チェックするためには、あなたが右のそれを行う場合

https://symfony.com/doc/current/reference/constraints/UniqueEntity.html

ユニークな使用であり、 http://symfony.com/doc/current/reference/constraints/UniqueEntity.html –

答えて

2

まあ、いくつかは、「symfonyの新しい」言葉を読んでいない...行うには

最初のものは、あなたのエンティティでユニークに電子メールを設定されている:

/** 
* @var string 
* 
* @ORM\Column(name="email_address", type="string", length=255, unique=true) 
*/ 
private $emailAddress; 

実行するのを忘れないでくださいdoctrine:schema:update --force

次のステップはFormTypeにタイプを設定します。ところで、あなたは電子メールがそのようないくつかの匿名yopmailまたはスタッフからではない場合、あなたがチェックするサービスを作成する必要があります

->add('email_address', EmailType::class) 

...どこでも TextType::classを追加する必要はありませんし、チェックするために電子メールドメイン FormTypeでも同様に行うことができますが、すべてのFormTypeに対してこれを行う必要があります。したがって、サービスはより良くなります。あなたは簡単にここでサービスを作成する方法について見つけることができます。あなたが本当に助けが必要な場合は、コメントし、私は例を書き留めます。

これらの匿名のメールサービスのリストはどこからでも見つけることができますが、Googleはあなたの友人です。

+1

- > add( 'email_address'、EmailType :: class)、これはブラウザの検証のみを追加します。有効な電子メールのみを保存するようにするには、エンティティでアサートを使用する必要があります。 – Carlos

+0

ああ〜知りませんでした、チップのおかげで@カロス – Preciel

1

エンティティレベルで電子メールの検証を直接確認することができます。それはエンティティ

のコードの唯一の2ライン(2アサート)
関連する問題