Есть АПИ, каждый запрос к нему (помимо ссылки на само АПИ) состоит из:
- название контроллера к которому нужно обратиться
- название метода который необходимо вызвать
- параметры (в некоторых методах есть обязательные параметры, в некоторых - их нет)
Собственно нужно реализовать компонент позволяющий формировать эти запросы, отравлять их и получать ответ. Я решил разделить этот компонент на три класса:
Класс запроса - позволяет пользователю "конструировать" тело запроса
сlass Query implements QueryInterface {
// объект клиента
protected $client;
// конструктор сохраняющий указатель на клиент
public function __construct(ClientInterface $client);
// возвращает название контроллера к которому необходимо обратиться
public function getController();
// возвращает название метода который нужно вызвать
public function getMethod();
// возвращает массив параметров запроса
public function getParams();
// выполняет запрос
public function execute() {
$this->client->execute($this);
}
// устанавливает значение параметра
public function setId($value);
}
Базовый класс клиента - отвечающий за формирование и отправку http-запроса
сlass BaseClient implements ClientInterface {
// формирует базовый http-запрос
public function prepareRequest();
// добавляет в базовый http-запрос параметры с класса Query,
//отправляет запрос на сервер и возвращает результат
public function send(QueryInterface $query);
}
Непосредственно класс клиента содержащий инструменты для вызова всех запросов
class Client extends BaseClient {
// создает объект запроса
public function findById($id){
return new Query($this);
}
}
Его можно использовать так:
$client = new Client();
$client->findById(1)->execute();
Но напрягают следующие моменты:
1. Получается взаимозависимость между классами Client и Query. Или в этом нет ничего страшного?
2. Запросов будет много - пару сотен, соответственно класс Client будет содержать в себе много методов. Не будет ли класс из за этого сильно раздутым?
3. Вообще такая структура компонента - нормальная практика?