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 和易于扩展的自定义实体创建关系时出错