Dependency injection 最大递归获取共享服务
我定义了两个类(Environment和ConfigurationReader)。两者都注册为共享依赖项 Environment类尝试获取当前环境,但为此,需要通过ConfigurationReader读取配置文件 序列图是: 课程包括:Dependency injection 最大递归获取共享服务,dependency-injection,phalcon,Dependency Injection,Phalcon,我定义了两个类(Environment和ConfigurationReader)。两者都注册为共享依赖项 Environment类尝试获取当前环境,但为此,需要通过ConfigurationReader读取配置文件 序列图是: 课程包括: class Environment { ... public function resolve() { $config = DI::getDefault()->getCfg(); $config->get
class Environment
{
...
public function resolve()
{
$config = DI::getDefault()->getCfg();
$config->getValue('pepe', 'db_name');
}
...
}
class ConfigurationReader
{
...
public function getValue($aConfig, $aKey)
{
$path = $this->getFile($aConfig);
}
protected function getFile($aConfig)
{
$env = DI::getDefault()->getEnv();
$path = 'config/' . $env->getShortName() . '/' . $aConfig . '.yml';
return $path;
}
...
}
并在index.php中注册和创建:
...
$di = new FactoryDefault();
$di->setShared('env', function() use ($di) {
$env = new Services\Environment($di);
$env->resolve();
return $env;
});
$di->setShared('cfg', function() use ($di) {
return new Services\ConfigurationReader($di);
});
$di->getShared('cfg');
$di->getShared('env');
...
因此,PHP在$config=DI::getDefault()->getCfg()时崩溃代码>并说:
PHP致命错误:超过最大递归深度
有什么想法吗?几句话
- 您将di传递给构造函数,但最终以静态方式获取它(di::getDefault())
- 关于无限循环,这是因为cfg需要env谁需要cfg谁需要env等等
要让框架自动将DI注入到您的服务中,您应该实现InjectionWareInterface()或
扩展组件类(如果您也需要事件管理,请使用插件而不是组件)。请看下面的讨论:
关于您的用例,您没有提供足够的上下文来给出详尽的答案,但我认为您可以将其简化为:
- ConfigService:除非使用来自不同环境名称空间的配置,否则应将$env->getShortName()值传递给服务构造函数(而不从环境服务获取)。在我们的应用程序中,env由nginx根据域名或其他参数确定,并作为环境变量传递给php。此外,如果您没有数百个配置文件,并且您的应用程序严重依赖它们,那么您应该在实例化时读取和解析它们一次,并将配置存储在服务中(作为关联数组、配置对象或任何您喜欢的内容)。添加一些缓存层以避免在每次请求时解析所有文件时浪费资源。Phalcons提供了配置组件来实现这一点。它附带文件适配器(仅ini和关联数组格式,但您可以轻松实现自己的yml适配器)。如果您的大多数应用程序配置依赖于可配置值,那么这可能是您想要实例化的第一个组件(或者至少在di中声明)。它不应该依赖于其他服务
- EnvService:您可以通过调用配置服务来访问配置值(如果要扩展组件,可以执行类似$this->cfg->getValue($key))的操作
您正在将$di传递给ConfigurationReader类,您在构造函数中使用它做什么?向Phalcon提问的人似乎很难结束回答他们的反馈循环。深思熟虑的书面回答@JesseQ Yep也注意到,这太糟糕了,因为phalcon是一个很棒的框架。。。