Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dependency injection 最大递归获取共享服务_Dependency Injection_Phalcon - Fatal编程技术网

Dependency injection 最大递归获取共享服务

Dependency injection 最大递归获取共享服务,dependency-injection,phalcon,Dependency Injection,Phalcon,我定义了两个类(Environment和ConfigurationReader)。两者都注册为共享依赖项 Environment类尝试获取当前环境,但为此,需要通过ConfigurationReader读取配置文件 序列图是: 课程包括: class Environment { ... public function resolve() { $config = DI::getDefault()->getCfg(); $config->get

我定义了两个类(Environment和ConfigurationReader)。两者都注册为共享依赖项

Environment类尝试获取当前环境,但为此,需要通过ConfigurationReader读取配置文件

序列图是:

课程包括:

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是一个很棒的框架。。。