如何在域驱动设计中处理用户会话

时间:2014-06-29 00:10:13

标签: php session domain-driven-design

如何在域驱动设计(在MVC框架中)处理用户会话?

我有一个User域对象,UserRepositoryUserService

我在我的UserService课程中使用了这种方法来记录用户。

public function login($email, $password, $remember = false)
{
    $user = $this->userRepo->findByEmail($email);

    if ($user && $user->getPassword() === $password) {
        return $user;
    }

    return false;
}

如何让他们使用会话登录?

如何根据会话用户ID自动加载用户?

有人可以给我一个代码示例,说明如何在我的DDD应用程序中维持用户?

2 个答案:

答案 0 :(得分:8)

从DDD的角度来看,管理会话是一组独特的行为,因此需要专门的服务。所以创建这样的服务。

您可以将该服务作为依赖项传递给UserService,因此UserService可以使用会话管理器存储身份验证信息。

更好的是,身份验证的概念也可能被视为一组独特的行为,因此也为此创建服务。将您的UserService和会话管理器作为依赖项传递给此身份验证服务。 (因此会话管理器不再是UserService的依赖项。)

但即使是身份验证也可以分解为几个不同的部分,这取决于你想要走多远。

我很遗憾无法向您展示任何代码,因为这在很大程度上取决于您要执行的身份验证类型(HTTP Basic,表单登录,OAuth等),您希望实现的抽象级别,以及个人喜好。

但是如果你想看看复杂系统的外观,请看一下Symfony 2的安全组件,here in the documentationhere on github

如果您考虑使用此组件,您可以查看Silex implements itgithub)如何了解如何使用它。

旁注

DDD不仅仅是以某种方式编写代码。如果你想学习DDD,我建议你阅读Domain-Driven Design: Tackling Complexity in the Heart of Software(蓝皮书),Implementing Domain-Driven Design(红皮书),或者你可以从Domain Driven Design Quickly开始下载,可以下载

答案 1 :(得分:0)

if(!isset($_SESSION['user'])) {
    if ($user && $user->getPassword() === $password) {
        $_SESSION['user'] = $user;
        return $user;
    }
} else {
    return $_SESSION['user'];
}

也许是这样的。只需确保在注销功能中销毁会话