mic*_*ael 5 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中内置了唯一的验证器,但我无法弄清楚如何使用它们.
我知道这是一个老问题,但我只需要解决这个问题,所以我想我会分享我的解决方案.
我不想使用任何捆绑来处理我的用户,所以这是我的手动方法:
<?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。它非常灵活,您可以通过修复细微的错误并测试一切是否真正按预期工作来节省一些时间。
不管怎样,如果你真的想自己构建它,你至少可以受到我上面提到的捆绑包的启发。他们定义自定义验证器并检查UserManager ( validateUnique) 中的唯一性。此外,您必须将其注册为服务才能通过构造函数注入提供UserManager。然后你只需将它用作普通的类验证器即可。