【问题标题】:Symfony Check if user exist in databaseSymfony 检查用户是否存在于数据库中
【发布时间】:2017-10-13 16:39:54
【问题描述】:

我正在我的控制器中寻找一种解决方案,以便在发送表单之前检查用户是否已存在于数据库中。这是我想要实施的操作。

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

感谢您的帮助

【问题讨论】:

    标签: php mysql symfony


    【解决方案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

    【讨论】:

    • 我试图警告用户他已经注册了。谢谢
    • 你可以用这个设置做到这一点。这就是它的用途。
    • 它验证您的数据库中没有其他用户使用该电子邮件。如果找到异常则抛出异常。关键是,您不必在控制器中编写查询来执行此操作。我已经更新了注释以表明您甚至可以根据需要包含自己的自定义错误消息。
    • 谢谢,但屏幕上的消息中没有任何内容。我必须向我的控制器添加一些东西吗?谢谢
    • 如果没有看到您的完整设置,我很难说。此示例假定您的 Invite 实体类上有一个“电子邮件”属性,您已正确设置注释并在 twig 中正确呈现您的表单。您是否在分析器中看到异常?
    【解决方案2】:
    // 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'));
            }
        }
    );
    

    【讨论】:

      【解决方案3】:
      <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) }}
      

      【讨论】:

        【解决方案4】:

        首先,获取 ID $id = #YourId;。然后,您可以使用 SQL 选择用户。 SELECT * FROM [user_table] WHERE id = $id;如果结果持有用户,则该用户存在。

        【讨论】:

        • 我直接在控制器或存储库中创建我的请求?谢谢
        • 您可以将其作为 SQL 语句运行。
        猜你喜欢
        • 2013-08-31
        • 2021-12-15
        • 2021-12-19
        • 1970-01-01
        • 2014-07-17
        • 2013-12-16
        • 2016-03-01
        • 1970-01-01
        相关资源
        最近更新 更多