2012-04-02 2 views
2

Я пытаюсь создать базовый клиент REST в PHP, чтобы как-то познакомиться с концепцией контейнера для инъекций зависимостей. В конце концов, я хотел бы сделать что-то вроде:PHP - контейнер DI в клиенте REST

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

Но я также хочу, чтобы быть в состоянии определить, какой объект должен обработать запрос (если я хочу использовать FOPEN вместо завитка, например).

Согласно тому, что я читал до сих пор, правильный способ достижения этой цели будет:

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

Мой вопрос: есть ли более простой способ построить зависимость между объектом пользователя и запрос объект? (базовая инъекция установщика на RestClient(), может быть?)

Заранее спасибо.

ответ

0

В зависимости от вашего существующего знания с впрыском зависимости, использование контейнера DI может перепрыгивать на глубокий конец. Короче говоря, это, конечно, можно заменить контейнер с простой инъекции инкубационном:

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

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

Фабьен Potencier имеет a good series on DI, вторая часть которой охватывает контейнеры DI (и когда использовать их).

+0

У меня все еще есть вопрос, если вы не против. Если у меня есть функция getUser ($ id) 'в моей функции класса RestClient, которая возвращает объект User, как я могу избежать сильной связи между классами RestClient и User, если я не использую контейнер DI? –

+0

Вот где контейнер DI может работать хорошо. Я бы попросил модель User взять контейнер под названием «Resolver», который по существу работает как адаптер для того, как пользовательский класс получает идентификатор. Затем у вас есть конкретный «RestClientResolver», который содержит ваш клиент REST и знает, как его использовать, чтобы получить пользователей по ID. – cmbuckley

+0

Не могли бы вы показать мне, как вы представляете себе экземпляр пользователя, рассматривающий ваше сообщение выше? Извините, если это звучит как глупый запрос, но я совершенно новичок в этих хороших практиках в oop. –

Смежные вопросы