如何在域驱动设计(在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应用程序中维持用户?
答案 0 :(得分:8)
从DDD的角度来看,管理会话是一组独特的行为,因此需要专门的服务。所以创建这样的服务。
您可以将该服务作为依赖项传递给UserService
,因此UserService
可以使用会话管理器存储身份验证信息。
更好的是,身份验证的概念也可能被视为一组独特的行为,因此也为此创建服务。将您的UserService
和会话管理器作为依赖项传递给此身份验证服务。 (因此会话管理器不再是UserService
的依赖项。)
但即使是身份验证也可以分解为几个不同的部分,这取决于你想要走多远。
我很遗憾无法向您展示任何代码,因为这在很大程度上取决于您要执行的身份验证类型(HTTP Basic,表单登录,OAuth等),您希望实现的抽象级别,以及个人喜好。
但是如果你想看看复杂系统的外观,请看一下Symfony 2的安全组件,here in the documentation和here on github。
如果您考虑使用此组件,您可以查看Silex implements it(github)如何了解如何使用它。
旁注
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'];
}
也许是这样的。只需确保在注销功能中销毁会话