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

Php 如何在域驱动设计中处理用户会话,php,session,domain-driven-design,Php,Session,Domain Driven Design,在域驱动设计(MVC框架)中如何处理用户会话 我有一个User域对象,一个UserRepository和一个UserService 我在我的UserService类中使用了这个方法来登录用户 public function login($email, $password, $remember = false) { $user = $this->userRepo->findByEmail($email); if ($user && $user->

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

我有一个
User
域对象,一个
UserRepository
和一个
UserService

我在我的
UserService
类中使用了这个方法来登录用户

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

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

    return false;
}
如何让他们使用会话登录

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

有人能给我一个例子,用代码说明我如何在DDD中支持我的应用程序中的用户吗

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

也许是这样的。只要确保在注销功能上销毁会话,从DDD的角度来看,管理会话是一组独特的行为,因此应该提供专门的服务。因此,创建这样一个服务

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

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

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

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

但是,如果您想了解复杂系统的外观,请查看Symfony 2的安全组件,以及

,如果您考虑使用这个组件,您可以查看如何()获得如何使用它的感觉。 旁注


DDD不仅仅是以某种方式编写代码。如果您想学习DDD,我建议您阅读(蓝皮书),(红皮书),或者您可以从下载的内容开始学习。

我还强烈建议您学习Symfony安全组件(或基于SpringFramework(Java)的Spring安全组件)因为它将身份验证和授权的复杂概念分解为具有明确关系的小块+向上一步。