2017-10-13 135 views
0

如果用戶已經存在於數據庫中,我正在查找我的控制器中用於在發送表單之前檢查的解決方案。這是我想要實施的行動。Symfony檢查用戶是否存在於數據庫中

/** 
* Creates a new invite entity. 
* 
* @Route("/inscription", name="invite_new") 
* @Method({"GET", "POST"}) 
*/ 
public function newAction(Request $request) 
{ 
    $invite = new Invite(); 

    $form = $this->createForm(InviteType::class, $invite); 

    if ($request->isMethod('POST')) { 
     $form->handleRequest($request); 
     if ($form->isSubmitted() && $form->isValid()) { 
      $em = $this->getDoctrine()->getManager(); 
      $em->persist($invite); 
      $em->flush(); 

      $this->get('app_mailer')->sendMailInscriptionMjml($invite, $this->getParameter('client_mail_to')); 

      $this->get('session')->getFlashBag()->add('success', 'Votre inscription à été pris en compte.'); 
     } else { 
      $this->get('session')->getFlashBag()->add('error', 'Une erreur est survenue.'); 
     } 

     return $this->redirect($this->generateUrl('invite_show', array('id' => $invite->getId()))); 
    } 

    return $this->render('@App/invite/new.html.twig', array(
     'invite' => $invite, 
     'form' => $form->createView(), 
    )); 
} 

謝謝您的幫助

回答

1

你不應該在控制器中這樣做。這是基本的實體驗證,Symfony帶有內置約束來處理這類事情。

假設您在Symfony應用程序中使用類似於以下的用戶實體,您只需要對用戶類應用唯一驗證約束並指定要針對唯一性測試哪些屬性。這個例子將驗證用戶是唯一的電子郵件,並拋出一個例外,如果不是。

// src/AppBundle/Entity/User.php 
namespace AppBundle\Entity; 
use Symfony\Component\Validator\Constraints as Assert; 
use Doctrine\ORM\Mapping as ORM; 
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; 

/** @UniqueEntity(
    * fields={"email"}, 
    * errorPath="email", 
    * message="It appears you have already registered with this email." 
    *) 
    */ 
class User 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @var string $email 
    * 
    * @ORM\Column(name="email", type="string", length=255, unique=true) 
    * @Assert\Email() 
    */ 
    protected $email; 

    // ... 
} 

支付通知@UniqueEntity("email")關於類和使用聲明的註釋。當然你需要將這個邏輯應用到你的用戶類中。

// controller action 
public function newAction(Request $request) 
{ 
    $invite = new Invite(); 

    $form = $this->createForm(InviteType::class, $invite); 

    if ($request->isMethod('POST')) { 
     $form->handleRequest($request); 
     if ($form->isSubmitted() && $form->isValid()) { 
      $em = $this->getDoctrine()->getManager(); 
      $em->persist($invite); 
      $em->flush(); 

      $this->get('app_mailer')->sendMailInscriptionMjml(
       $invite, $this->getParameter('client_mail_to') 
      ); 

      $this->get('session')->getFlashBag() 
       ->add('success', 'Votre inscription à été pris en compte.'); 

      return $this->redirect(
       $this->generateUrl(
       'invite_show', array(
        'id' => $invite->getId() 
       ) 
      ) 
      ); 
     } 
    } 

    return $this->render('@App/invite/new.html.twig', array(
     'invite' => $invite, 
     'form' => $form->createView(), 
    )); 
} 

有關這方面的:

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

+0

我試圖警告用戶他已經註冊。 謝謝 – Chris99391700

+0

你可以用這個設置來做到這一點。這是它的目的。 –

+0

它驗證數據庫中沒有其他用戶使用該電子郵件。然後拋出異常,如果它發現一個。關鍵是,您不必在控制器中編寫查詢來執行此操作。如果需要,我已更新註釋以顯示您甚至可以包含自己的自定義錯誤消息。 –

-1

首先,獲得ID $id = #YourId;。然後您可以選擇使用SQL的用戶。 SELECT * FROM [user_table] WHERE id = $id;如果結果包含用戶,則該用戶存在。

+0

我直接創建了我的請求在控制器或倉庫?謝謝 – Chris99391700

+0

您可以將它作爲SQL語句運行。 – wanderer0810

1
// Pass in the entity manager to your form via options 
// Do this before you call $this->createForm: 
// $options['entityManager'] = $this->getDoctrine()->getManager(); 
// then call $form = $this->createForm(InviteType::class, $invite, $options); 

// Inside your form type i.e. InviteType 
$em = $options['entityManager']; 

$builder->addEventListener(
    FormEvents::PRE_SUBMIT, 
    function (FormEvent $event) { 
     $data = $event->getData(); 
     $form = $event->getForm(); 
     $user = $data['user']; // this needs to be whatever you called user in your form 
     $userRepo = $em->getRepository('User'); // this needs to be the location of your user repository 
     if ($userRepo->findOneBy(['user' => $user])) { // you need to pick a field that determines how you will search for the user via the repository 
      $form->addError(new FormError('User already exists')); 
     } 
    } 
); 
+0

我的代碼有錯誤。 – Chris99391700

0
<div class="container accroche"> 
    <h5>{{ 'Inscription aux évenements'|trans }}</h5> 
    <p>Le Lorem Ipsum est simplement du faux texte employé dans la composition et la mise en page avant impression. Le Lorem Ipsum est le faux texte standard de l'imprimerie depuis les années 1500, 
     quand un peintre anonyme assembla ensemble des morceaux de texte pour réaliser un livre spécimen de polices de texte. Il n'a pas fait que survivre cinq siècles, mais s'est aussi adapté à la bureautique informatique, 
     sans que son contenu n'en soit modifié. Il a été popularisé dans les années 1960 grâce à la vente de feuilles Letraset contenant des passages du Lorem Ipsum, et, plus récemment, 
     par son inclusion dans des applications de mise en page de texte, comme Aldus PageMaker. 
    </p> 
</div> 
{{ form_start(form, {attr: {novalidate: 'novalidate','id':'formValidate'}}) }} 
<div class="middle"> 
    <div class="middle_form"> 
     <div class="container"> 

      <div class="stepwizard"> 
       <div class="stepwizard-row setup-panel col-md-12 text-center"> 
        <div class="stepwizard-step col-md-3"> 
         <a href="#step-1" type="button" class="btn btn-primary btn-circle">1</a> 
        </div> 
        <div class="stepwizard-step col-md-3"> 
         <a href="#step-2" type="button" class="btn btn-default btn-circle" disabled="disabled">2</a> 
        </div> 
        <div class="stepwizard-step col-md-3"> 
         <a href="#step-3" type="button" class="btn btn-default btn-circle" disabled="disabled">3</a> 
        </div> 
        <div class="stepwizard-step col-md-3"> 
         <a href="#step-4" type="button" class="btn btn-default btn-circle" disabled="disabled">4</a> 
        </div> 
       </div> 
      </div> 

      <div class="row setup-content" id="step-1"> 
       <div class="col-md-12"> 
        <h3>{{ 'Informations invités'|trans }}</h3> 
        <div class="row"> 
         <div class="input-field col-12"> 
          {{ form_widget(form.name, {'attr': {'class': 'validate', 'id': 'last_name'}}) }} 
          {{ form_errors(form.name) }} 
          <label for="last_name">{{ 'Nom'|trans }} <sup>*</sup></label> 
         </div> 
        </div> 
        <div class="row"> 
         <div class="input-field col-12"> 
          {{ form_widget(form.surname, {'attr': {'class': 'validate', 'id': 'surname'}}) }} 
          {{ form_errors(form.surname) }} 
          <label for="surname">{{ 'Prénom'|trans }} <sup>*</sup></label> 
         </div> 
        </div> 
        <div class="row"> 
         <div class="input-field col-12"> 
          {{ form_widget(form.email, {'attr': {'class': 'validate', 'id': 'email'}}) }} 
          {{ form_errors(form.email) }} 
          <label for="email">{{ 'E-mail'|trans }} <sup>*</sup></label> 
         </div> 
        </div> 
        <div class="row"> 
         <div class="col-12"> 
          <label>{{ 'Présence'|trans }} <sup>*</sup></label> 
          {{ form_widget(form.dispo, {'attr': {'class': 'validate', 'id': 'dispo'}}) }} 
          {{ form_errors(form.dispo) }} 
         </div> 
        </div> 
        <button class="btn btn-primary nextBtn btn-lg pull-right" type="button">{{ 'SUIVANT'|trans }}</button> 
       </div> 
      </div> 

      <div class="row setup-content" id="step-2"> 
       <div class="col-md-12"> 
        <h3>{{ 'Informations participants'|trans }}</h3> 
        <div class="row"> 
         <ul class="customers" 
          data-prototype="{{ form_widget(form.customers.vars.prototype)|e('html_attr') }}"> 
          {% for customers in form.customers %} 
           <div class="row"> 
            <div class="input-field col-12"> 
             {{ form_row(customers.name, {'attr': {'class': 'validate', 'id': 'name'}}) }} 
             {{ form_errors(customers.name) }} 
            </div> 
           </div> 
           <div class="row"> 
            <div class="input-field col-12"> 
             {{ form_row(customers.surname, {'attr': {'class': 'validate', 'id': 'surname'}}) }} 
             {{ form_errors(customers.surname) }} 
            </div> 
           </div> 
           <div class="row"> 
            <div class="input-field col-12"> 
             {{ form_row(customers.old) }} 
             {{ form_errors(customers.old) }} 
            </div> 
           </div> 
          {% endfor %} 
         </ul> 
        </div> 
        <button class="btn btn-primary prevBtn btn-lg pull-left" type="button">{{ 'PRECEDENT'|trans }}</button> 
        <button class="btn btn-primary nextBtn btn-lg pull-right" type="button">{{ 'SUIVANT'|trans }}</button> 
       </div> 
      </div> 

      <div class="row setup-content" id="step-3"> 
       <div class="col-md-12"> 
        <h3>Logements</h3> 
        <div class="row"> 
         <div class="input-field col-12"> 
          {{ form_widget(form.housing, {'attr': {'class':'validate'}}) }} 
          {{ form_errors(form.housing) }} 
          <label>{{ 'Comment allez vous vous logez ?'|trans }} <sup>*</sup></label> 
         </div> 
        </div> 
        <div class="row"> 
         <div class="input-field col-12"> 
          {{ form_widget(form.hotel, {'attr': {'class':'validate'}}) }} 
          {{ form_errors(form.hotel) }} 
          <label>{{ 'Hôtel'|trans }} <sup>*</sup></label> 
         </div> 
        </div> 
        <button class="btn btn-primary prevBtn btn-lg pull-left" type="button">{{ 'PRECEDENT'|trans }}</button> 
        <button class="btn btn-primary nextBtn btn-lg pull-right" type="button">{{ 'SUIVANT'|trans }}</button> 
       </div> 
      </div> 

      <div class="row setup-content" id="step-4"> 
       <div class="col-md-12"> 
        <h3>{{ 'Arrivée/Départ'|trans }}</h3> 
        <div class="row"> 
         <div class="col-12"> 
          <label>{{ 'Date d\'arrivée'|trans }} <sup>*</sup></label> 
          {#<input class="datepicker" type="text" id="dateArrival" name="form[dateArrival]"/>#} 
          {{ form_widget(form.dateArrival, {'attr': {'class': 'datepicker validate'}}) }} 
          {{ form_errors(form.dateArrival) }} 
         </div> 
        </div> 
        <div class="row"> 
         <div class="col-12"> 
          <label>{{ 'Date de départ'|trans }} <sup>*</sup></label> 
          {#<input class="datepicker" type="text" id="dateDeparture" name="form[dateDeparture]"/>#} 
          {{ form_widget(form.dateDeparture, {'attr': {'class': 'datepicker validate'}}) }} 
          {{ form_errors(form.dateDeparture) }} 
         </div> 
        </div> 
        <div class="row"> 
         <div class="input-field col-12"> 
          {{ form_widget(form.transport, {'attr': {'class':'validate'}}) }} 
          {{ form_errors(form.transport) }} 
          <label>{{ 'Transport utilisé'|trans }} <sup>*</sup></label> 
         </div> 
        </div> 
        <div class="btn-center"> 
        <button class="btn btn-primary prevBtn btn-lg pull-left" type="button">{{ 'PRECEDENT'|trans }}</button> 
        {{ form_widget(form.save, {'attr': {'class':'btn btn-success', 'id':'SaveAccount'}}) }} 
        </div> 
       </div> 
      </div> 
     </div> 
    </div> 
</div> 


{{ form_widget(form.dateArrival, {'attr': {'class': 'hidden'}}) }} 
{{ form_widget(form.dateDeparture, {'attr': {'class': 'hidden'}}) }} 
{{ form_end(form) }} 
相關問題