PHP MVC:config类作为依赖关系或仅使用类常数,可以从总体上访问



在我的MVC项目(PHP 7.1(中,我有一个Config类和众多配置文件,每个config Files看起来都这样:

return [
    'web' => [
        'host' => 'localhost',
        //...
    ],
];

在应用程序输入点我制作了Config类的实例,并加载所有配置文件数组。然后,创建的对象将作为需要它的所有类中的构造函数参数传递:

class AbstractView {
    private $config;
    public function __construct(Config $config) {
        $this->config = $config;
    }
    private function prepareContext() {
        $this->assign('appHost', $this->getConfig()->get('web/host'));
    }
}

因为在我的应用程序中完全通过Config对象是一项非常"巨大的努力",所以我想实现只有类常数的Config类,例如:

class Config {
    const WEB_PROTOCOL = 'http';
    const WEB_HOST = 'localhost';
}

并通过

直接从总体上访问它们
class AbstractView {
    private function prepareContext() {
        $this->assign('appHost', Config::WEB_HOST);
    }
}

我的问题是:

  1. 这是一个非常不错的选择,请记住我想完全避免在我的应用程序中静态状态?
  2. 这个替代方案是"静态"一个或绝对不是吗?
  3. 可检验性呢(我还没有任何经验(?

非常感谢。

如果您打算测试此代码,这将非常复杂,因为您必须为每个变体提供一个自定义自动加载器,您想测试(嗯..您也可以使用单个自动加载器,它具有一些静态方法来悬挂其行为(。这将使整个单位测试一场噩梦。

在您的位置中,我会朝着不同的方向:尝试隔离配置。似乎您正在传递所有配置,即使实例仅使用一个或两个值。

这种方法会导致隐藏的依赖性,从而产生高度耦合的代码,而您实际上不知道,您的实例是必需的。

建议

开始在代码中使用DI容器。

它将让您卸载大量配置,因为您从配置中提取的某些"参数"可以作为构造函数中的直接依赖项传递。

并使用神奇的Config实例,其中DIC不是一个干净的选项。但是,您可能应该使用多个Config实例,每个实例代表设置的一部分,它们一起使用。

相关内容

最新更新