2016-12-07 122 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/UniqueEntity.html –

回答

2

好了,一些沒看過的話「新的symfony」 ......

首先要做的是設置你的電子郵件唯一在實體:

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

不要忘記執行doctrine:schema:update --force

下一步將是你已經做了什麼,在FormType中設置類型。
順便說一句,你不需要添加TextType::class無處不在...

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

並檢查電子郵件來自一些匿名yopmail或類似的東西是不是,你需要創建一個服務,它會檢查電子郵件域。 你也可以在FormType中做到這一點,但你需要爲每個FormType做這件事,因此服務會更好。您可以在此處輕鬆找到有關如何創建服務的信息。如果你真的需要幫助,評論,我會寫下一個例子。

你可以在任何地方找到這些匿名電子郵件服務的列表,谷歌是你的朋友。

+1

- > add('email_address',EmailType :: class),這隻會增加瀏覽器驗證。應在實體中使用Assert,以確保只保存有效的電子郵件。 – Carlos

+0

哦〜不知道,謝謝你的提示@Carlos – Preciel

相關問題