我希望能够更改和传递我的UserEntity的某些部分,并且某些部分应保持不变。
例如,我从不想更改我的UserEntity的ID,但是诸如电子邮件或密码之类的东西可能会经常更改,并且也可以由UserEntity之外的其他对象使用。
创建UserEntity时就是这种情况的一个实例。由于没有id不能存在UserEntity,因此我的 Controller 可以创建一个UserData对象,以标准化UserEntity属性。映射器在数据库中创建一个实体后,它将创建一个新的UserEntity并在构造函数中传递id和UserData对象。
当UserEntity需要电子邮件或密码等信息时,只需查看其UserData。
似乎更便于携带,但这是矫kill过正吗?有更好的解决方案吗?
注意
email
必须始终为n
长度,并且必须采用有效格式,name
必须始终为n
长度,以此类推。我在这里的目标是,我希望能够在一个位置设置这些“规则”。并且由于UserEntity的这些属性(可变属性)存在于实体本身之外,因此有时它们可能会独立存在于自己的值对象中。 最佳答案
我认为没有“一种真正的方法”来做到这一点(无论您读了什么)……如果在您的模型中有意义,那么对我来说听起来就不错。我不确定当您说“其中许多字段需要标准化”时是什么意思,以及为什么不能作为UserEntity的一部分来做到这一点,但是无论如何。就是说,很有可能您无需完全独立的对象类就可以准确地完成您想做的事情。
评论/评论:
您所建议的并没有真正符合严格的“对象”模型,即UserData只是由确实是UserEntity属性的事物组成,并且与这些属性没有其他基础关系。
我不太确定为什么需要一个单独的对象在实体外部传递...如果需要数据,为什么不能只传递UserEntity并从那里访问它呢?在将数据传递给UserEntity构造函数之前,您需要对数据做些什么,而这不能像在stdClass实例中将数据收集在一起然后在UserEntity中进行处理那样容易地完成?
如果是我,我会做更多类似以下的事情(例如,创建一个新用户):
<?
// assume an appropriately defined UserEntity class...
// I'm using stdClass just to keep the parameters together to pass all at once
// I'm assuming some basic user data passed from the browser
$user_data = (object) array(
'email' => $_REQUEST['email'],
'name' => $_REQUEST['name'],
'password' => $_REQUEST['password'],
'confirm_password' => $_REQUEST['confirm_password']
);
/*
validateData is static so it can be called before you create the new user
It takes the $user_data object to validate and, if necessary, modify fields.
It also takes a $create flag which indicates whether the data should be
checked to make sure all of the necessary fields are there to create the user
with. This allows you to call it on update with the $create flag unset and it
will pass validation even if it's missing otherwise required fields.
It returns $result, which indicates pass or failure, and the potentially modified
$user_data object
*/
$create = TRUE;
list($result, $user_data) = UserEntity::validateData($user_data, $create);
// equivalence allows you to pass back descriptive error messages
if ($result === TRUE) {
// create the user in the database, get back $user_id...
$user = new UserEntity($user_id, $user_data);
}
else {
// return error to user
}
// access user data either individually, or if you want just make a getter
// for the entire group of data, so you can use it just like you would a
// separate UserData object
send_double_opt_in($user->getUserData());
?>
编辑以解决提供的更多信息:
您说这些属性存在于UserEntity之外,并且它们有可能独立存在...您是说可以甚至不打算将它们用作UserEntity对象而收集,使用和丢弃这些属性吗?如果是这种情况,那么单独的对象将完全适合该数据。如果不是这样,如果数据始终从属于现有或将来的UserEntity,那么从...的角度来看,这些属性将永远不会“独立存在”。让我们将其称为“全局数据”。当您将整个系统视为一个整体,而不仅仅是时不时的代码时,数据很可能“属于” UserEntity类。
至于静态方法,我看不出有什么特别的理由来避免使用它们(显然),但是要避免使用它们自己的方法。许多其他架构会稍微复杂一些,但是这里有一些选择:
$this->status = 'error';
或类似的东西来告诉您必须处理的不良情况) 。 $status
属性,以指示验证失败。 关于php - 是否可以将域实体的可变属性存储为值对象?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9747865/