Symfony2:奏鸣曲实体中的自定义标识符

Posted

技术标签:

【中文标题】Symfony2:奏鸣曲实体中的自定义标识符【英文标题】:Symfony2: Custom identifier in Sonata entities 【发布时间】:2015-03-25 09:35:14 【问题描述】:

我有一个在 __construct 函数上生成的具有自定义 ID(即 UUID)的实体。

namespace AppBundle\Entity;
use Rhumsaa\Uuid\Uuid;
use Doctrine\ORM\Mapping as ORM;

/**
* @ORM\Entity
*/
class Person

    /**
    * @ORM\Id
    * @ORM\Column(type="string")
    */
    private $id;

    /**
    * @ORM\Column(type="string")
    */
    private $name;

    public function __construct()
    
        $this->id = Uuid::uuid4()->toString();
    

此实体用于奏鸣曲以及项目的其他部分。在持久化和刷新它之前,我需要这个实体有 id,所以我不能使用自动增量。

所以,问题是奏鸣曲不允许我创建实体,因为它采用创建选项作为并在执行时进行编辑,因为该实体已经有一个 id,但该实体此时不存在,所以它失败了。

问题不在于生成 UUID 的库,'id' 的任何值都失败。

有人知道怎么解决吗?解决问题的另一种类似方法?

【问题讨论】:

你能显示一些代码来澄清你的意思吗? 我已经编辑了问题。 【参考方案1】:

你不应该在构造函数中设置你的 id,而应该在第一次持久化之前使用prePersist Doctrine 事件来改变你的实体。

您可以使用注释来执行此操作,请参阅the Doctrine Documentation on prePersist。

在构造函数中设置 id 的问题是当你从数据库中检索它时可能会覆盖它,在这种情况下它会不正确。

【讨论】:

该实体也用于非奏鸣曲代码中,我需要在将其持久化到数据库之前拥有一个 ID。如何解决? 为什么在持久化之前需要ID?只能坚持吗?在这种情况下,prePersist 将预先填充它。否则,如果是管理关系,我建议您仅在实体持久化后检索 ID。 用于测试目的。例如,我有一个记录 de id 的服务: $this->logger->info("Person: ".$person->getId());而且我不想坚持和刷新该实体,因为它花费了大量时间,而且我不想在该测试中注入真正的实体管理器,只是一个模拟。 你的意思是你想在持久化之前记录id?那你为什么不记录有关该实体的其他信息呢? ID 应尽可能由 DBMS 管理。 这不是真的。在教义中,构造函数仅在第一个实体创建期间被调用一次。然后通过代理类初始化所有对象。

以上是关于Symfony2:奏鸣曲实体中的自定义标识符的主要内容,如果未能解决你的问题,请参考以下文章

与 FOSUserBundle 和易于扩展的自定义实体创建关系时出错

带有自定义菜单的 Symfony2 与奏鸣曲集成

如何在奏鸣曲中获取字段类型的自定义值?

在奏鸣曲管理实体的显示模板中添加自定义表单

Symfony2 - 安装了 FOS 用户包的自定义身份验证提供程序

SonataMediaBundle 与自定义实体一起使用