Мне было поручено разработать веб-сайт (PHP), где большая часть его содержимого получена из частного веб-API (JSON). Это была крутая кривая обучения для меня с точки зрения дизайна приложения, но пока у меня есть:
Создал библиотеку PHP SDK / wrapper, чтобы предоставить мне методы для извлечения и сохранения данных в и из API. Я искал примеры, такие как Google Client SDK для вдохновения. Внутренне он использует GuzzleHttp, чтобы сделать тяжелую работу.
Создан класс модели для каждого ответа на данные, который я ожидаю от API. Теперь я могу работать с реальными моделями классов с предсказуемыми и предопределенными переменными.
Использовал отличный пакет 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», потому что я борюсь с этим.
заранее спасибо
Вы должны отделить хранилище объектов от объектов. Для пользователя вы можете создать:
class UserRepository {
public __construct($api)
public findById($id);
public find(Criteria $criteria);
public save (User $user);
}
Вы также можете прочитать о разделении командных запросов.
Других решений пока нет …