2016-07-27 36 views
1

Hallo Ich mache eine PHP-Anwendung mit Silex und ich möchte Dependency Injection verwenden. Für Dependency Injection muss ich die Abhängigkeiten in den Container laden. Ich habe eine Datei, die alle Definitionen enthält, was in den Container namens di.php geladen werden soll. Es sieht so aus.Sollen bei jeder Anfrage alle Abhängigkeiten geladen werden?

/** 
* 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']); 
}; 

aber diese Datei bei jeder Anforderung angefordert wird und alle Abhängigkeiten werden in den Container geladen, ist meine Frage, wie kann ich die Abhängigkeiten laden, die ich nur für eine Anfrage benötigen und noch nicht alles.

+4

Sie definieren Callback-Funktionen, die diese Objektinstanzen * zurückgeben, wenn sie * aufgerufen werden. Ich weiß nichts über Silex, aber wenn nicht jemand diese Funktionen aufruft, werden die Objekte nicht geladen/instanziiert. – deceze

Antwort

2

Wie @deceze in ihrem Kommentar sagt (sollte es eine Antwort geben!), Alles, was Sie "load" auf jede Anfrage ist eine Reihe von Funktionen Ausdruck Anweisungen. Sie können Ihre Provider grundsätzlich als "Klassen" betrachten, in denen die Funktionsdeklarationen als Funktionsausdrücke und nicht als Funktionsanweisungen ausgeführt werden. Wie in einer normalen Klasse, die Funktionen nicht laufen einfach weil Sie sie definieren, nicht wahr? Nein. Sie müssen sie tatsächlich anrufen, bevor sie etwas tun.

Der Code innerhalb des Ausdrucks Funktion des Dienstes $app['db.connection'] zugewiesen nur ausgeführt, wenn Sie$app['db.connection'] verwenden. Ansonsten haben Sie nur eine Variable definiert, die eine Funktion enthält.

Offensichtlich in $app['db.connection'] Sie sind mehr als wahrscheinlich werde es jede Anfrage auf die eine oder andere Weise verwenden. Aber zum Zweck des Arguments $app['post.repository'] wird nur seine Callback ausgeführt, wenn Sie aktiv $app['post.repository'] in dieser Anfrage verwenden.

Sinn machen? Ich kann weiter ausholen, wenn nicht.