Symfony 2唯一验证器

时间:2011-09-29 16:24:44

标签: php forms validation symfony

我正在尝试使用一些需要唯一的字段来验证表单 - 用户名和电子邮件地址。如果我提交表单,我会收到数据库错误。我想像我为其他一切使用验证器 - 现在我正在尝试在对象中使用自定义getter和isvalidUsername函数,我不确定在对象中使用实体管理器是否是执行此操作的最佳方法。这是我到目前为止所做的工作......

    Frontend\UserBundle\Entity\User:
         properties:
             email:
                  - NotBlank: ~
                  - Email: ~
         username:
             - NotBlank: ~
         getters:
              validUsername:
                   - "True": { message: "Duplicate User detected.  Please use a different username." }
              validEmail:
                   - "True": { message: "Duplicate email detected. Please use a different email." }

fosuserbundle中内置了唯一的验证器,但我无法弄清楚如何使用它们。

3 个答案:

答案 0 :(得分:5)

我知道这是一个老问题,但我只需要解决这个问题,所以我想我会分享我的解决方案。

我不想使用任何捆绑来处理我的用户,所以这是我的手动方法:

<?php
namespace MyCorp\CorpBundle\Entity;
use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\Email;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\User\AdvancedUserInterface;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/** User - Represent a User object */
class User implements AdvancedUserInterface {

    /** @var integer $id */
    private $id;

    /** @var string $email */
    private $email;

    /** Constructor, Getters, Setters etc... */

    /** Set a list of rules to use when validating an instance of this Class 
        @param Symfony\Component\Validator\Mapping\ClassMetadata $metadata */
    public static function loadValidatorMetadata(ClassMetadata $metadata) {

        $metadata->addPropertyConstraint('email', new MaxLength(255));
        $metadata->addPropertyConstraint('email', new NotBlank());
        $metadata->addPropertyConstraint('email', new Email());

        $metadata->addConstraint(new UniqueEntity(array(
            "fields" => "email", 
            "message" => "This email address is already in use")
        ));

    }

}

如您所见,我在模型中定义了验证。 Symfony会调用loadValidatorMetadata来加载验证程序。

答案 1 :(得分:1)

首先,我建议您使用FOSUserBundle。它非常灵活,您可以通过修复细微错误并测试一切是否真正按预期工作来节省您自己花费的时间。

无论如何,如果你真的想自己构建它,你至少可以通过我上面提到的捆绑来激发灵感。他们定义custom validator并检查UserManagervalidateUnique)中的唯一性。此外,您必须将其注册为service以通过构造函数注入提供UserManager。然后,您只需将其用作普通class validator

答案 2 :(得分:0)

UniqueEntity验证约束,用于确保用户为特定属性提供唯一值。

有关使用Symfony支持的各种格式的示例,请参阅documentation。以下是使用注释的示例:

// Acme/UserBundle/Entity/Author.php
namespace Acme\UserBundle\Entity;

use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\ORM\Mapping as ORM;

// DON'T forget this use statement!!!
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

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

    // ...
}