【发布时间】:2014-01-24 20:30:06
【问题描述】:
Statics、consts 和 singletons 被认为是一种不好的做法,因为它们阻碍了测试,并且由于在不同地方的引用而产生了维护问题。在网站的迷你框架中,我遇到了这些问题并想替换静态,但不知道在一个用例中的最佳替代方案。
此用例由基于组的权限系统说明:对于客户端 C 有权访问数据项 X,C 的授权组名称数组中的组名称必须与 X 的“必需”名称数组中的一个匹配。
比较(“客户端是否有此身份验证?”)可以很容易地抽象为动态调用。但是,当为客户端分配组名,或在数据项上分配“必需”组名时,我如何单独引用它们并确保每个组都来自一个集中定义的集合,没有静态?
当前代码如下:
$client->appendAuzGroupName( Tokens::AUZ_GRP_PUBLIC );
-- 每次缓存刷新时,令牌都会从配置文件中加载值。
在这里和网络上搜索发现了很多反对静态/常量/单例的建议,但我发现替换它们的唯一想法是“使用 IoC / DI”。但是,通过参数获取这些值只会将问题转移到代码中的不同位置。
我愿意更改为另一种身份验证系统设计,但它必须具有这种粒度级别,并且列出用户名(ACL 设计)似乎不太可能大规模实用。
【问题讨论】:
-
也许我理解错了,但是您不想将所有这些值都存储在数据库中吗?
-
我猜你的令牌是只读的并且从配置中读取一次?似乎您当前使用静态的设置绝对没问题。为什么要采用简单、可行、可维护的解决方案并通过 IoC 增加复杂性?
-
@grebneke,这是一个很小且很少更改的集合,不是最好不要在每个请求上引发 I/O 吗?
-
@Steve,当前的设计阻止了单元测试,如果值列表发生变化,则需要查找多个类中的所有引用。
-
@neochipmonk:这取决于您的应用程序和配置需求。如果它很少更改并且您的用户不介意编辑配置文件 - 只需选择有效的方法并忽略数据库 + IoC/DI 流行语。你必须自己判断什么是合理的。
标签: php