【发布时间】:2016-01-08 20:25:07
【问题描述】:
将复合键验证约束插入到与FOSUserBundle 的User 实体相关联的表单构建器的最佳位置是什么?
让我详细说明。
我有一个扩展FOSUserBundle\Model\User 的User 实体。我添加了几个字段(特别是team 字段)。每个User 只属于一个Team。
现在,我想制作一个注册系统,允许用户直接成为一个特定团队的成员(通过诸如/register/{teamSlug} 之类的路线)。新用户必须输入他的电子邮件地址,但电子邮件必须仅在团队级别上是唯一的。此约束转换为所选数据库中的UNIQUE KEY team_email (team_id, email)。
当然,我会在数据库表中定义一个唯一键,但这只会确保没有数据被插入,同时在尝试无效写入时抛出数据库异常。
我考虑在User 实体上使用@UniqueEntity 属性,但它似乎不起作用:
(编辑:我添加了一个缺失的use 语句。)
use FOS\UserBundle\Model\User as BaseUser;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
/**
* @ORM\Entity
* @ORM\Table(name="user")
* @UniqueEntity(
* fields={"email", "team"},
* message="This email already exists in this team."
* )
*/
class User extends BaseUser
{
// ...
}
我发现的另一件事是the callback assert。当使用MyBundle\Entity\User 的 data_class 验证 FormBuilder 实例时,也许我可以使用它来验证团队范围内是否存在电子邮件,但是,这将破坏 Entity 的封装,因为它需要 Entity 了解自己的存储库,等等。
执行此操作的最佳方法是什么?
【问题讨论】:
标签: php symfony doctrine-orm fosuserbundle