我们的项目将一些数据存储在一个$_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身份验证而不是会话吗?
答案 0 :(得分:1)
这就是我的看法:
如果我们想象你有一个使用RESTful API的梦想系统,那么客户端和服务器之间的通信可能依赖于“access_token”解决方案,这意味着会有一个或多个类将授权用户并检查用户权限。
此解决方案将在引导过程中以某种方式使用,但应优选地隔离和解耦,从而通过依赖注入范例实现。这将为您提供开箱即用的能力,将一个实施替换为另一个实施(真棒单位测试奖金,呃!)
然而,第一次实施可以完全建立在当前会议之上。为了方便起见,您可以使用$_SESSION['app']
或Di::getDefault()->getSession()->get('app')
之类的“简单”替换Di::getDefault()->getAuthorizedUser()->getApp()
开始,然后不断增强您的功能。