0

我试图了解域对象、数据映射器和服务的结构,但是我很难准确地掌握去哪里。

这个问题非常相似,但没有帮助的答案。

需要来自多个对象的属性的方法是否应该进入;

  1. 域对象,或
  2. 服务类,或
  3. 两者都不...

我担心创建一个繁重的 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; 
        }
    }
}
4

2 回答 2

1

User.isAdmin() 起初让我印象深刻。但是在您的情况下,似乎 User 和 UserGroup 一起确定了 User 是否是管理员。所以我们不能把责任放在用户或用户组。

在这种情况下,我通常会引入一个 Specification 对象(对不起,示例是用 Java 编写的)。

public class AdminSpec {
   private SomeComponetToRetrieveUserGroup userGroup;

   public AdminSpec(SomeComponetToRetrieveUserGroup userGroup) {
       this.userGroup = userGroup;
   }

   public boolean isSatisfiedBy(User user) {
       // Perform the actual check
   }
}

因此,域对象不会被不希望的责任破坏,域逻辑仍然保留在域层中(而不是在应用程序服务中)。

您可以在 DDD 书籍或http://en.wikipedia.org/wiki/Specification_pattern中找到有关规范模式的更多详细信息。

希望这可以帮助。

于 2013-07-14T05:48:25.517 回答
1

首先,恕我直言,您在错误的级别执行授权检查(阅读这篇文章了解更多详细信息)。另一件事是 - 您似乎正在从模型层将数据返回给控制器(或您的区域等效项)。这样的boolean响应表明,您的控制器中有应用程序逻辑溢出。

如果你想坚持你当前的结构,那么这样的事情会更有意义:

class UserService
{
    // .. snip
    public function someMethod( $id ) 
    {

        $userMapper = $this->dataMapperFactory->build('user');
        $groupMapper = $this->dataMapperFactory->build('user');

        $user = $this->domainObjectFactory->build('user');
        $user->setId($id);
        $group = $this->domainObjectFactory->build('usergroup');
        $group->setId( UserGroup::ADMIN_GROUP );

        $userMapper->fetch($user);
        $groupMapper->fetch($group);


        return $group->hasUser( $user );
    }

}

my 2 cents

于 2013-07-14T12:47:58.497 回答