Symfony 2唯一验证器


Symfony 2 unique validator

我试图验证表单的一些字段需要是唯一的-用户名和电子邮件地址。如果我提交的形式,我得到一个数据库错误。我想使用一个验证器,就像我做的其他一切-现在我试图使用自定义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中有内置的唯一验证器,但我还没能弄清楚如何使用它们

我知道这是一个老问题,但我刚刚不得不解决这个问题,所以我想我将分享我的解决方案。

我不喜欢使用任何bundle来处理我的用户,所以这是我的手动方法:

<?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让您加载验证器

首先,我建议您使用FOSUserBundle。这是相当灵活的,你可以节省一些时间,你花在修复细微的错误和测试,如果一切都真的按预期工作。

无论如何,如果你真的想自己构建它,你至少可以从我上面提到的bundle中得到启发。它们定义自定义验证器并检查UserManager (validateUnique)中的唯一性。此外,您必须将其注册为服务,以便通过构造函数注入提供UserManager。然后,您只需将其用作普通的类验证器。

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

请参考文档中使用Symfony支持的各种格式的示例。下面是一个使用注释的例子:

// 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;
    // ...
}