如何摆脱我们的$ _SESSION?

时间:2016-03-27 17:12:23

标签: php session refactoring

我们的项目将一些数据存储在一个$_SESSION['app']中。有一个“主”对象包含可以在代码中使用的大约10个其他对象的公共实例。事实上,其中只有一个是经常使用的($_SESSION['app']->login->getuserId()),其中两个总共使用了4-5次。

由于我们已经创建了一个RESTful API,除了我们的项目之外,我们希望在API中使用我们项目的一些功能,因此需要摆脱几乎所有对象中的许多方法中使用的会话。长期以来,我们希望完全切换到客户端和服务器之间的RESTful通信。

由于我们是一个小团队,我们无法一次性重构所有代码,但需要在不破坏代码的情况下逐步完成。

我的第一次尝试是将会话对象转换为像这样的单身:

class Main {

  private static $main = null;

  public static function getInstance() {
    self::$main = $_SESSION['app'] ?? self::$main ?? new Main();
    return self::$main;
  }

  public function __construct {
    // ...
  }
}

这种方式有一段时间了,我们可以保留$ _SESSION ['app']的实例化,然后在一小步工作中完全删除会话。到目前为止,我的尝试工作正常,但它只会改变我对Main类的概念性问题。

此外,我已经读过在大多数情况下使用Singleton模式是一个坏主意,并理解该观点的论据。在我们的项目中,我们还没有使用单元测试,但我想尽快使用它来代替我的代码。

那么什么是更好,更可靠的方法来摆脱我们的$_SESSION - 变量并处理像userID这样的数据,以便可以从任何地方访问它,以便最后我们可以使用RESTful身份验证而不是会话吗?

1 个答案:

答案 0 :(得分:1)

这就是我的看法:

如果我们想象你有一个使用RESTful API的梦想系统,那么客户端和服务器之间的通信可能依赖于“access_token”解决方案,这意味着会有一个或多个类将授权用户并检查用户权限。

此解决方案将在引导过程中以某种方式使用,但应优选地隔离和解耦,从而通过依赖注入范例实现。这将为您提供开箱即用的能力,将一个实施替换为另一个实施(真棒单位测试奖金,呃!)

然而,第一次实施可以完全建立在当前会议之上。为了方便起见,您可以使用$_SESSION['app']Di::getDefault()->getSession()->get('app')之类的“简单”替换Di::getDefault()->getAuthorizedUser()->getApp()开始,然后不断增强您的功能。