Первый вопрос здесь, и я понимаю, что это очень открытый вопрос.
Несколько лет назад я принял клиент API на основе PHP, который используется для взаимодействия с API платформы управления сетью UniFi, предоставляемой Ubiquiti. Этот клиент использует cURL, со временем он значительно вырос благодаря моим вкладам и моим собственным усилиям и стал довольно популярным с более чем 33 КБ загрузок.
API, с которым общается этот клиент, частично является RESTful, но большая часть маршрутов — нет. В дополнение к этому, API официально не документирован, хотя я получал внутренние документы от поставщика за последние пару лет. Кроме того, существует несколько незначительных вариаций API (немного отличающиеся структуры URL-адресов и методы аутентификации), которые клиент может идентифицировать и соответственно обрабатывать. Вот пример из основного login()
функция:
/**
* first we check whether we have a "regular" controller or one based on UniFi OS,
* prepare cURL and options
*/
if (!($ch = $this->get_curl_resource())) {
return false;
}
$curl_options = [
CURLOPT_HEADER => true,
CURLOPT_POST => true,
CURLOPT_NOBODY => true,
CURLOPT_URL => $this->baseurl . "https://codereview.stackexchange.com/",
];
curl_setopt_array($ch, $curl_options);
/**
* execute the cURL request and get the HTTP response code
*/
curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if (curl_errno($ch)) {
trigger_error('cURL error: ' . curl_error($ch));
}
/**
* we now proceed with the actual login
*/
$curl_options = [
CURLOPT_NOBODY => false,
CURLOPT_POSTFIELDS => json_encode(['username' => $this->user, 'password' => $this->password]),
CURLOPT_HTTPHEADER => ['content-type: application/json'],
CURLOPT_REFERER => $this->baseurl . '/login',
CURLOPT_URL => $this->baseurl . '/api/login'
];
/**
* specific to UniFi OS-based controllers
*/
if ($http_code === 200) {
$this->is_unifi_os = true;
$curl_options[CURLOPT_URL] = $this->baseurl . '/api/auth/login';
}
Репо можно найти здесь: https://github.com/Art-of-WiFi/UniFi-API-client
Меня беспокоит то, что размер класса вырос до более чем 3900 строк: https://github.com/Art-of-WiFi/UniFi-API-client/blob/master/src/Client.php
В дополнение к этому, я бы хотел заменить использование trigger_error()
с Исключениями для улучшенной обработки ошибок.
Я просмотрел общие шаблоны проектирования PHP, но, похоже, не могу найти комбинацию, которая соответствует варианту использования этого клиента. Может ли кто-нибудь предложить лучший подход для рефакторинга этого клиента API и какие шаблоны проектирования использовать?
Также приветствуются другие отзывы.