PHP OOP:为域实体提供;“身份”;

PHP OOP:为域实体提供;“身份”;,php,model,map,dns,identity,Php,Model,Map,Dns,Identity,这里有点抽象的问题。我正在试验域模型模式,并阻止我与依赖关系的其他争斗——我需要一些关于生成标识以在标识映射中使用的标识的建议 在我见过的大多数数据映射器模式示例中(包括本书中概述的模式:)-用户似乎使用setter手动设置给定域对象的标识: $UserMapper = new UserMapper; //returns a fully formed user object from record sets $User = $UserMapper->find(1); //returns

这里有点抽象的问题。我正在试验域模型模式,并阻止我与依赖关系的其他争斗——我需要一些关于生成标识以在标识映射中使用的标识的建议

在我见过的大多数数据映射器模式示例中(包括本书中概述的模式:)-用户似乎使用setter手动设置给定域对象的标识:

$UserMapper = new UserMapper;

//returns a fully formed user object from record sets
$User = $UserMapper->find(1);

//returns an empty object with appropriate properties for completion
$UserBlank = $UserMapper->get();
$UserBlank->setId();
$UserBlank->setOtherProperties();
现在,我不知道我是否读错了示例-但是在第一个$User对象中,$id属性是从数据存储中检索的(我假设$id代表一个行id)。但是,在后一种情况下,如果对象尚未从数据存储中获取$id,如何设置该对象的$id? 问题是为对象生成一个有效的“标识”,这样就可以通过标识映射来维护它——所以生成任意整数并不能解决这个问题

我目前的想法是为标识指定不同的字段(即电子邮件),并要求它们在生成空白域对象时出现。或者,要求所有对象完全成形,并使用所有属性作为它们的标识……几乎没有效率


(或者,转储域模型概念并返回DBAL/DAO/Transaction脚本…与我所看到的ORM实现相比,它看起来越来越优雅…)

如果控制ID,如果要覆盖数据存储ID,您将使用setId函数,或者,如果您想更新/删除数据,而不必首先检索数据(即已从帖子中获取ID)。 另一种方法是调用setId()通过“查询”(插入记录)下一个可用ID的数据存储来保留ID


在您实际需要使用ID来引用某个内容之前,ID设置为什么并不相关。不带参数调用setId除了将对象标记为新数据外,不会做任何事情。一旦您真正尝试“获取”ID,它就是生成ID的时间。对懒散ID生成进行排序。

感谢您的回答,这帮助我找到了处理此问题的方法。我可以在空白实体上设置任意ID,该实体在保存时被丢弃/替换为行ID。剩下的问题是如何在保存之前避免重复的空白属性-但我想如果有可用的标识字段(即对所有挂起的DO电子邮件字段运行检查),可以通过标识字段来解决这一问题。许多感谢您可以使用静态变量(UserMapper::$ids)跨对象跟踪唯一值。使其成为一个数组,这样您就可以创建一个“列表”,您可以从中添加/删除。