我想确保在验证我的实体时没有重复的用户名
/**
* @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对象),它应该简单地描述一个实体——它不应该负责任何与持久性相关的事情。如果需要运行自定义查询,可以从存储库类或单独的服务执行。存储库类已经具有对实体管理器的访问权限。如果您使用自定义服务,只需将实体管理器注入其中。