2012-04-02 5 views
2

Ich versuche einen einfachen REST-Client in PHP zu erstellen, um mich mit dem Konzept des Dependency-Injection-Containers vertraut zu machen. Letztlich würde Ich mag, wie etwas zu tun ist:PHP - DI-Container in einem REST-Client

$client = new RestClient(); 
$client->getService('user', array('id, optional fields...')); 

Aber ich möchte, sollte auch die Anforderung, welches Objekt angeben können, behandeln (wenn ich anstelle von curl verwenden fopen wollen, zum Beispiel).

Nach dem, was ich bisher gelesen habe, eine richtige Art und Weise, dies zu erreichen wäre:

$request = new ServiceDefinition( 
    'Curl', 
    array('...') 
); 
$user = new ServiceDefinition('User', 
    array(new ServiceReference('request')) 
); 
$container = new ServiceContainer(array( 
    'request' => $request, 
    'user' => $user, 
)); 

Meine Frage ist: Gibt es einen einfacheren Weg, um die Abhängigkeit zwischen dem Benutzerobjekt und dem Wunsch zu bauen Objekt ? (eine grundlegende Setter-Injektion auf RestClient(), vielleicht?)

Vielen Dank im Voraus.

Antwort

0

Abhängig von Ihrer bestehenden Vertrautheit mit Dependency Injection, kann die Verwendung eines DI-Containers am tiefen Ende einspringen. Kurz gesagt, ist es sicherlich möglich, den Behälter mit einfacher Setter Injektion zu ersetzen:

interface HttpAdapterInterface {} 
class CurlAdapter implements HttpAdapterInterface {} 
class SocketAdapter implements HttpAdapterInterface {} 

class RestClient { 
    public function setHttpAdapter(HttpAdapterInterface $adapter) { 
     // ... 
    } 
} 

Fabien Potencier a good series on DI hat, der zweiten Teil davon umfasst DI-Container (und wenn sie zu benutzen).

+0

Ich habe immer noch eine Frage, wenn es Ihnen nichts ausmacht. Wenn ich ein 'getUser ($ id)' in meiner RestClient-Klassenfunktion habe, die ein User-Objekt zurückgibt, wie vermeide ich dann die starke Kopplung zwischen den RestClient- und User-Klassen, wenn ich keinen DI-Container verwende? –

+0

Hier könnte ein DI-Container gut funktionieren. Ich würde das Benutzermodell einen Container nehmen lassen, der so etwas wie 'Resolver' genannt wird, der im Wesentlichen als ein Adapter dafür dient, wie die Benutzerklasse durch eine ID bekommt. Dann haben Sie einen konkreten 'RestClientResolver', der Ihren REST-Client enthält und weiß, wie er verwendet wird, um Benutzer anhand einer ID zu ermitteln. – cmbuckley

+0

Würde es Ihnen etwas ausmachen, mir zu zeigen, wie Sie sich eine Benutzerinstanziation vorstellen, wenn Sie Ihren Beitrag oben betrachten? Tut mir leid, wenn es wie eine dumme Anfrage klingt, aber ich bin ziemlich neu in diesen guten Praktiken in oop. –