php - 如何在领域驱动设计中处理用户 session

标签 php session domain-driven-design

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

我有一个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;
}

如何让他们在 session 中保持登录状态?

我如何根据 session 用户 ID 自动加载用户?

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

最佳答案

从 DDD 的角度来看,管理 session 是一组独特的行为,因此值得专门的服务。所以创建这样一个服务。

您可以将该服务作为依赖项传递给您的 UserService,这样 UserService 就可以使用 session 管理器来存储身份验证信息。

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

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

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

但是如果你想看看一个复杂的系统是什么样的,看看 Symfony 2 的安全组件,here in the documentationhere 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 开始可供下载。

关于php - 如何在领域驱动设计中处理用户 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24472057/

相关文章:

c# - 使用 HTTPHandler 时禁用 session 状态访问

ruby-on-rails - Chrome 扩展 session 管理 : How to authorize user account on rails 3 back-end via plugin

.net - 存储库模式中的事务

architecture - 如何在 DDD + CQRS + Event Sourcing 方法中处理业务规则?

PHP 将 mysql_connection 转换为 PDO

php - 跟踪用户在我的网站上花费的时间

php - 比较 php 和 sql 的时间

c# - 在 C# 中实现 DDD 实体类

php - 循环关联数组时优化 SQL 更新

php - 将 PDO 与 INSERT (PHP) 结合使用