【问题标题】:Is it correct to access entity manager in entity class (to ensure no duplicate username)在实体类中访问实体管理器是否正确(确保没有重复的用户名)
【发布时间】:2011-12-04 05:18:23
【问题描述】:

我想在验证我的实体时确保没有重复的用户名

/**
 * @var string $name
 *
 * @ORM\Column(name="name", type="string", length=32)
 * @Assert\NotBlank();
 * @Assert\Callback(methods={"isUniqueUsername"})
 */
private $name;

我想我需要使用验证器回调。然后我将不得不使用该用户名查询数据库中的用户,所以我需要实体管理器?我如何访问它?并“正确”访问它?我是否改用验证器类?仅仅为了验证 1 个字段而创建一个类似乎很麻烦?

【问题讨论】:

    标签: validation symfony doctrine-orm


    【解决方案1】:

    在 symfony2 中,有一个 Unique 验证器,您可以使用它来确保用户名、电子邮件地址或任何其他字段是唯一的。使用注解时,其工作方式如下:

    use Symfony\Bridge\Doctrine\Validator\Constraints as Unique;
    
    /**
     * @ORM\Entity
     * @ORM\Table
     * @Unique\UniqueEntity(fields={"email"},message="Your email is already registered")
     */
    class User{
      // ...
    }
    

    当尝试通过表单添加用户时,您应该得到唯一注释中所述的消息。

    【讨论】:

    • 如果我需要 username、email 和 displayName 是唯一的,我就输入fields={"username", "email", "displayName"}?唯一我的意思是我不应该有 2 个相同的用户名(我不是指作为一个组,我想 UniqueEntity 仍然是我需要的吗?)
    • 从我的脑海中,我可以说你需要定义 3 次 Unique\UniqueEntity 一次一个字段。
    【解决方案2】:

    您不应在实体内使用实体管理器 - 它会破坏关注点分离。您的实体类是一个 POPO(普通的旧 PHP 对象),它应该简单地描述一个实体 - 它不应该负责任何与持久性相关的事情。如果您需要运行自定义查询,请从存储库类或单独的服务中执行此操作。存储库类已经可以访问实体管理器。如果您使用自定义服务,只需将实体管理器注入其中即可。

    【讨论】:

    • 就我而言,哪个更合适?服务还是存储库?我正在验证唯一的用户名/电子邮件
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    • 2023-03-19
    • 2011-12-03
    相关资源
    最近更新 更多