在实体类中访问实体管理器是否正确(以确保没有重复的用户名)



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

/**
 * @var string $name
 *
 * @ORMColumn(name="name", type="string", length=32)
 * @AssertNotBlank();
 * @AssertCallback(methods={"isUniqueUsername"})
 */
private $name;

我想我需要使用Validator回调。然后我将不得不查询数据库的用户与该用户名,所以我需要实体管理器?我如何访问它?然后"正确地"访问它?我应该使用验证器类吗?创建一个类只是为了验证一个字段似乎相当麻烦?

在symfony2中,有一个惟一验证器,您可以使用它来确保用户名、电子邮件地址或任何其他字段是惟一的。当使用注释时,它是这样工作的:

use SymfonyBridgeDoctrineValidatorConstraints as Unique;
/**
 * @ORMEntity
 * @ORMTable
 * @UniqueUniqueEntity(fields={"email"},message="Your email is already registered")
 */
class User{
  // ...
}

当尝试通过表单添加用户时,您应该得到Unique注释中声明的消息。

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

最新更新