2017-10-13 2 views
0

Je cherche une solution dans mon contrôleur pour vérifier avant d'envoyer un formulaire si l'utilisateur existe déjà dans la base de données. Voici mon action sur laquelle je voudrais mettre en œuvre ceci.Symfony Vérifier si l'utilisateur existe dans la base de données

/** 
* 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(), 
    )); 
} 

Merci pour votre aide

Répondre

1

Vous ne devriez pas avoir besoin de faire cela dans le contrôleur. C'est la validation d'entité de base et Symfony est livré avec des contraintes intégrées pour gérer ce genre de chose. En supposant que vous utilisez une entité utilisateur similaire à celle ci-dessous dans votre application Symfony, vous devez appliquer une contrainte de validation unique à la classe d'utilisateurs et spécifier les propriétés que vous souhaitez tester pour l'unicité. Cet exemple va valider que l'utilisateur est unique par e-mail, et lancer une exception sinon. Payer l'annotation @UniqueEntity("email") sur la classe et les instructions d'utilisation. Bien sûr, vous devrez adopter cette logique pour votre classe d'utilisateurs.

// 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(), 
    )); 
} 

Pour en savoir plus sur ce point:

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

+0

J'essaie d'avertir l'utilisateur qu'il est déjà enregistré. Merci – Chris99391700

+0

vous pouvez le faire avec cette configuration. C'est ce que c'est. –

+0

Il vérifie qu'il n'y a pas d'autres utilisateurs avec cet email dans votre base de données. Puis lève l'exception si elle en trouve un. Le fait est que vous n'avez pas besoin d'écrire une requête dans votre contrôleur pour le faire. J'ai mis à jour l'annotation pour montrer que vous pouvez même inclure votre propre message d'erreur personnalisé si vous le souhaitez. –

-1

Tout d'abord, obtenir l'ID $id = #YourId;. Vous pouvez ensuite sélectionner l'utilisateur en utilisant SQL. SELECT * FROM [user_table] WHERE id = $id; Si le résultat contient un utilisateur, l'utilisateur existe.

+0

Je crée ma demande directement dans le contrôleur ou dans le dépôt? merci – Chris99391700

+0

Vous l'exécutez comme une instruction 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

J'ai une erreur sur votre code. – 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) }}