【问题标题】:Symfony2 composite key constraint in Form builder表单构建器中的 Symfony2 复合键约束
【发布时间】:2016-01-08 20:25:07
【问题描述】:

将复合键验证约束插入到与FOSUserBundleUser 实体相关联的表单构建器的最佳位置是什么?

让我详细说明。

我有一个扩展FOSUserBundle\Model\UserUser 实体。我添加了几个字段(特别是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


    【解决方案1】:

    唯一实体可以正常工作,但您需要定义正确的验证组以使其与 fos 用户一起使用

    @UniqueEntity(
           fields={"email", "team"},
           groups={"Registration", "Profile"},
           message="This email already exists in this team."
      )
    

    【讨论】:

    • 我不是很清楚 - 我已经添加了 use 语句(没有它,我一直收到一个非常描述性的异常)。我已经编辑了我的问题以反映这一点。但是,我不知道groups 也适用于@UniqueEntity
    • 不幸的是 - 没有。正如你所说,我已经添加了 UniqueEntity,添加了正确的组,将表单配置为使用正确的验证组。当我填充电子邮件字段并验证表单时,它对数据库执行零查询(我为此启用了 mysql 查询日志记录)。
    • 也许@UniqueEntity 仅在将实体持久化到数据库之前触发?
    猜你喜欢
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多