Как использовать конкретные экземпляры ресурса при использовании статических методов (PHP)

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

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

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

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

Теперь к вопросу.

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

$user->save()

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

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

$user = User::get_by_id(1);

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

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

Model::$api = new Api;

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

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

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

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

1

Решение

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

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

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]