我试图验证表单的一些字段需要是唯一的-用户名和电子邮件地址。如果我提交的形式,我得到一个数据库错误。我想使用一个验证器,就像我做的其他一切-现在我试图使用自定义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;
// ...
}