2016-04-06 2 views
1

私は2つのクラス(EnvironmentとConfigurationReader)を定義しました。両方とも共有依存として登録されています。共有サービスを取得する最大再帰

Environmentクラスは現在の環境を取得しようとしますが、このためにConfigurationReaderを介して環境設定ファイルを読み込む必要があります。

シーケンス図である。

enter image description here

クラスは以下のとおりです。

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 Fatal error: Maximum recursion depth exceeded

+1

$ diをあなたのConfigurationReaderクラスに渡していますが、コンストラクタで何をやっていますか? –

答えて

3

カップルはあなたがコンストラクタにディを渡しますが、無限ループについて(DI ::のgetDefault())静的

  • それを取得して終了している

    • を発言、それがあるためですCFGは、フレームワークが自動的にInjectionAwareInterfaを実装する必要がありますいずれかのあなたのサービスにDIを注入させるには、ENVなどを必要とCFGを必要とするのenv .....

    を必要としますce(https://docs.phalconphp.com/en/latest/reference/di.html#automatic-injecting-of-the-di-itself)または をComponentクラスに拡張します(イベント管理が必要な場合は、ComponentではなくPluginを使用してください)。この議論を見て:あなたのユースケースについてhttps://forum.phalconphp.com/discussion/383/plugin-vs-component-what-s-the-difference-

    、あなたは徹底的な答えのために十分なコンテキストを与えることはありませんが、私はあなたのようにそれを簡素化することができると思う:

    • ConfigService:あなたが使用していない限り他のenvネームスペースから設定する場合は、$ env-> getShortName()の値をサービスコンストラクタに渡す必要があります(envサービスから取得する必要はありません)。私たちのアプリではenvはドメイン名やその他のパラメータに基づいてnginxによって決定され、phpに環境変数として渡されます。また、何百もの設定ファイルがなく、アプリが頻繁に依存している場合は、インスタンシエーション時にそれらを読み込んで解析し、設定をサービスに保存する必要があります(連想配列、設定オブジェクトなど) 。キャッシュレイヤーを追加すると、各要求ですべてのファイルを解析するリソースを無駄にするのを防ぎます。 PhalconsはConfigコンポーネントを提供しています。ファイルアダプタ(iniおよび連想配列形式のみですが、独自のymlアダプタを簡単に実装できます)が付属しています。ほとんどのアプリケーション設定が設定可能な値に依存している場合は、おそらくインスタンス化したい(または少なくともdiに宣言したい)最初のコンポーネントになります。他のサービスとの依存関係であってはなりません。

    • EnvService:configサービスを呼び出すことで設定値にアクセスできます(コンポーネントを拡張する場合は、$ this-> cfg-> getValue($ key)など)。

  • +1

    Phalconの質問に尋ねる人々は、答弁者のフィードバックループを閉鎖するのを吸うように見えます。よく考え、書いた答え! –

    +1

    @JesseQあまりにも気付きましたが、カルコンは素晴らしいフレームワークなので、あまりにも悪いです... – peuh

    関連する問題