2015-09-07 3 views
1

Мне поручено разработать веб-сайт (PHP), где большая часть его содержимого получена из частного веб-API (JSON). Это был крутой кривой обучения для меня с точки зрения разработки приложений, но до сих пор у меня есть:Как использовать конкретные экземпляры ресурса при использовании статических методов (PHP)

  1. создал библиотеку PHP SDK/обертку, чтобы предоставить мне с методами извлечения и сохранения данных в и из API , Я искал примеры, такие как SDK Google Client для вдохновения. Внутри он использует GuzzleHttp для тяжелого подъема.

  2. Создал класс модели для каждого из ответов на данные, которые я ожидаю от API. Теперь я могу работать с реальными классами моделей с предсказуемыми и заранее определенными переменными.

  3. Использовал отличный пакет JSONMapper для рекурсивно отображать ответы API JSON в экземпляры модели.

Теперь на вопрос.

Я думал, что это было бы хорошая идея, чтобы обеспечить методы каждую модели, такие как:

$user->save()

Это позволит сэкономить данные конкретизированного объекта с помощью API SDK экземпляра, имеющегося в модели. Приложению не нужно заботиться о том, где находится хранилище данных, или как использовать API. Все хорошо.

поэтому я тоже думал, что это хорошая идея, что объекты должны быть в состоянии принести себя (например, как Laravel делает, с его Foo :: найти() рисунок), так что я создал статические методы, такие как:

$user = User::get_by_id(1);

Проблема в том, что, поскольку это статический метод, у меня нет способа получить доступ к определенному экземпляру моего API SDK из модели пользователя. У меня нет возможности легко вводить эту зависимость, не передавая ее в каждом вызове функции.

Как «User» расширяет «Модель» в этом примере, поэтому я использовал:

Model::$api = new Api;

Это здорово сейчас, но если по какой-либо причине нужно использовать конкретный экземпляр моего API SDK на некоторых моделях я не смогу.

Как лучше всего использовать конкретный экземпляр моего SDK API, сохраняя при этом эти статические методы на своих объектах, или я лаяю неправильное дерево, и это анти-шаблон, и вместо этого я должен использовать какой-то другой механизм для создания и выбора объектов?

В настоящее время я работаю над «PHP, Object Patterns and Practice», потому что я борюсь с этим.

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

+0

Проблема, которую вы описываете, является одной из основных проблем с шаблоном Active Record. Классы модели тесно связаны с объектами доступа к данным, клиентом API в вашем случае. –

ответ

0

Вы должны отделить хранилище объектов от объектов. Для пользователя вы можете создать:

class UserRepository { 
    public __construct($api) 
    public findById($id); 
    public find(Criteria $criteria); 
    public save (User $user); 
} 

Вы также можете прочитать о разделении запроса команды.

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