2016-07-27 14 views
1

こんにちは私はSilexを使用してPHPアプリケーションを作成しています。依存性注入を使いたいと思います。依存性注入については、依存関係をコンテナにロードする必要があります。私はdi.phpというコンテナに何をロードするのかの定義をすべて含んだファイルが1つあります。すべての要求にすべての依存関係をロードする必要がありますか?

/** 
* DI.php 
*/ 
$app['db.connection'] = function() use($app) { 
    return new Connection([ 
     'dbname' => $app['dbname'], 
     'dbuser' => $app['dbuser'], 
     'dbpass' => $app['dbpass'], 
     'dbhost' => $app['dbhost'], 
    ]); 
}; 

$app['user.repository'] = function() use($app) { 
    return new UserRepository($app['db.connection']); 
}; 

$app['post.repository'] = function() use($app) { 
    return new PostRepository($app['db.connection']); 
};  

$app['index.controller'] = function() use($app) { 
    return new IndexController($app['user.repository']); 
}; 

$app['post.controller'] = function() use($app) { 
    return new PostController($app['post.repository']); 
}; 

しかし、このファイルはすべてのリクエストで要求され、すべての依存関係がコンテナにロードされ、私の質問は、私は私が唯一の要求ではなく、すべてのために必要な依存関係を読み込むことができる方法です。

+4

あなたは、*呼び出されたときにそれらのオブジェクトインスタンスを返すコールバック関数を定義しています*。私はSilexについて知らないが、誰かがそれらの関数を呼び出さない限り、オブジェクトはロード/インスタンス化されない。 – deceze

答えて

2

@decezeは、彼らのコメント(shouldaはそれを答えにしました!)として、あなたが要求ごとに「読み込んでいる」すべては、関数式文の束です。基本的にプロバイダを「クラス」と見なすことができます。ここでは、関数宣言は関数ステートメントではなく関数式として実行されます。通常のクラスでは、関数はを実行するだけでは定義できません。いいえ。何かをする前に実際に電話する必要があります。

$app['db.connection']サービスに割り当てられた関数式内のコードは、$app['db.connection']を使用した場合にのみが実行されます。そうしないと、関数を保持する変数が定義されます。

明らかに$app['db.connection']の場合は、であると思われます。しかし、議論のために、$app['post.repository']は、そのリクエストに積極的に$app['post.repository']を使用している場合にのみコールバックが実行されます。

意味がありますか?もしそうでなければ、私はさらに精緻化することができます。

関連する問題