【问题标题】:Symfony 2 Doctrime 2 and form validate ( unique field )Symfony 2 Doctrime 2 和表单验证(唯一字段)
【发布时间】:2016-06-08 22:51:16
【问题描述】:

您好,我有一个小问题。我从来没有在 sf2 中做过表单验证器,所以我不知道我应该从哪里开始。我有一个“用户名”字段,它在数据库中是唯一的,那么我该如何尝试呢?

我的代码:

-> 实体

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

-> 形式

 public function buildForm(FormBuilder $builder, array $options)
 {
     $builder
         ->add('nick_allegro')
     ;
 }

 public function getDefaultOptions(array $options) {
     return array(
         'data_class' => 'My\FrontendBundle\Entity\Licence',
     );
 }

-> 控制器

 /**
  * Displays a form to create a new Licence entity.
  *
  * @Route("/new", name="licence_new")
  * @Template()
  */
  public function newAction()
  {
      $entity = new Licence();
      $form   = $this->createForm(new LicenceType(), $entity);

      return array(
          'entity' => $entity,
          'form'   => $form->createView()
      );
  }

  /**
   * Creates a new Licence entity.
   *
   * @Route("/create", name="licence_create")
   * @Method("post")
   * @Template("MyFrontendBundle:Licence:new.html.twig")
   */
  public function createAction()
  {
      $entity  = new Licence();
      $request = $this->getRequest();
      $form    = $this->createForm(new LicenceType(), $entity);
      $form->bindRequest($request);

      if ($form->isValid()) {
          $em = $this->getDoctrine()->getEntityManager();
          $em->persist($entity);
          $em->flush();

          return $this->redirect($this->generateUrl('licence_show', array('id' => $entity->getId())));

      }

      return array(
          'entity' => $entity,
          'form'   => $form->createView()
      );
  }

->查看

 <form action="{{ path('licence_create') }}" method="post" {{
 form_enctype(form) }}>
     {{ form_widget(form) }}
     <p>
         <button type="submit">Create</button>
     </p> </form>

【问题讨论】:

  • Symfony2 或 2.1?但是,我认为您应该阅读官方文档的whole chapter。您的问题不是那么具体,应该回答有关表单、控制器、表单自定义、验证等的问题。

标签: forms validation symfony symfony-2.1


【解决方案1】:

您需要在 symfony 中使用Unique Entity 来验证模型中的特定字段是否唯一。

为您提供一点帮助(如果您有一个名为 nick 的字段):

1/ 在您的实体中

use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
/**
* @ORM\Entity
* @UniqueEntity("nick")
*/
class User
{
/**
 * @var string $email
 *
 * @ORM\Column(name="nick", type="string", length=255, unique=true)
 */
private $nick;

当您在实体中声明约束时,验证将直接生效。 因此,您已经可以在控制器中检查验证了。

2/ 在你的控制器中

if ( 'POST' === $request->getMethod()) {

        $form->bind($request);

        if ($form->isValid())
        {
            //do something if the form is valid
        }
}

【讨论】:

  • 我有那个:' /** * * * @ORM\Column(name="nick", type="string", length=255, unique=true, nullable=true) */私人 $nick; '
  • 在您的问题中,您提到了username 字段。哪个字段需要是唯一的 usernamenick?在这种情况下我会避免nullable = true
  • 感谢您的帮助,var 没关系,真的是 'nick-allegro'。我芦苇文档,什么都没有。我的 symfony 是 2.0.10。我在实体中添加了唯一性并生成了 crud,所以一切都应该没问题,但是我从 sql 中得到错误:'SQLSTATE [23000]:完整性约束违规:1062 Duplicate entry'有什么想法吗?
  • 我粘贴了我的代码。嗯谢谢你的帮助,我是盲人:(我忘记了@UniqueEntity("nick"),并使用类。抱歉问题
  • 最后一个问题,如何将自己的消息添加到唯一验证?
【解决方案2】:

这很简单。足够添加文件实体@ORM\Column this "unique=true"

例子:

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

【讨论】:

    【解决方案3】:

    请记住,sf2.1 中的表单处理发生了一些变化,因此请务必检查正确的文档:

    Validation is done in many ways,以及其他在实体字段上带有注释的,在您的情况下,您需要 UniqueEntity 注释。

    请务必在线查看所有 symfony2 文档,因为这是了解问题的最佳方式。

    【讨论】:

      猜你喜欢
      • 2011-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-30
      • 2014-03-04
      相关资源
      最近更新 更多