【发布时间】:2013-07-12 04:46:17
【问题描述】:
我试图了解域对象、数据映射器和服务的结构,但是我很难准确地掌握什么去哪里。
This 的问题非常相似,但没有有用的答案。
需要来自多个对象的属性的方法是否应该进入;
- 域对象,或
- 服务类,或
- 也不...
我担心创建一个繁重的 Service 类,但这种方法似乎比同时编辑 DO 和 DataMapper 更简单。
final class UserService extends ServiceAbstract
{
public function user_is_admin($id)
{
// Build the user object
$userMapper = $this->dataMapperFactory->build('user');
$user = $this->domainObjectFactory->build('user');
$user->id = $id;
$userMapper->fetch($user);
// Build the admin usergroup object
$usergroup = $this->domainObjectFactory->build('usergroup');
$usergroupMapper = $this->dataMapperFactory->build('usergroup');
$usergroup->id = ADMIN_USERGROUP_ID;
$usergroupMapper->fetch($usergroup);
// Perform the actual check
if(in_array($user->id, $usergroup->aMembers))
{
return true;
}
}
}
【问题讨论】:
-
为什么要打破
$user和$userGroup实例的封装? -
@tereško 请原谅我的无知,但我不确定我是否理解你的问题,我在破坏什么?
-
@tereško 我相信这有点离题,但我想你希望我写 $user->setId($id);代替 $user->id = $id;?
-
这就是为什么它是评论而不是答案的一部分。使用这种方法意味着两种可能性之一:要么您使用
public可见性作为域对象的参数,要么您正在使用魔术__set()方法。这两者都倾向于对应用产生威慑作用。魔术方法往往会成为复杂的黑洞,public参数使您无法控制域对象中值何时以及如何更改,同时完全绕过任何验证和检查。
标签: php oop model-view-controller domain-driven-design datamapper