Класи контролерів
У цьому розділі описані всі класи PHP, які використовуються в WP API. Вони поділяються на два типи: Класи інфраструктури та Класи контролерів (маршрутів, кінцевих точок, ресурсів).
Загальні відомості
У WP API використовується принцип Model-View-Controller – це стандартна модель розробки додатків. Суть цієї моделі в тому, що логіка програми розділена таким чином, що можна змінювати одну його частину, так щоб зміни не вплинули на іншу частину.
За такою схемою, логіка коду WP-API поділена на незалежні компоненти (класи):
- Клас отримання запиту.
- Класи контролерів (обробка запити та створення відповіді).
- Клас відповіді на запит (отримує підготовлену контролером відповідь і формує її у стандартний JSON вигляд, встановлює заголовки відповіді та код відповіді).
Клас запиту та відповіді – це Класи інфраструктури WP API, з ними як правило працювати не потрібно. Ми, розробники, майже завжди працюватимемо з Класом контролера .
Завдання Класу контролера об’єднати окремі частини обробки запиту API у єдиний механізм. Вони мають створюватися маршрути, вони отримують запити обробляють їх і генерують відповіді. Також там описується схема ресурсу .
Концепція контролера прийнята в рамках WP-API для того, щоб мати стандартний шаблон для класів контролера – класів, що представляють ресурси (кінцеві точки). Шаблоном класу контролера є абстрактний клас WP_REST_Controller . Кожен клас контролера повинен мати аналогічну схему методів, зроблено так, щоб усі кінцеві точки мали однакові назви PHP методів.
Класи інфраструктури та Класи контролерів
Класи інфраструктури доповнюють класи контролерів – вони обробляють логіку API, але з виконують перетворень даних. Також і класи контролерів (кінцевих точок) інкапсулюють необхідну логіку для виконання CRUD операцій з ресурсами, але не пов’язані з логікою інфраструктури. Це і є згадана вище модель Model-View-Controller.
До класів інфраструктури належать:
- WP_REST_Server – фундаментальний контролер REST API, який обслуговує запит . За будь-якого запиту до API спочатку викликається WP_REST_Server і визначає, який запитується маршрут, а потім передає колббек маршруту об’єкт WP_REST_Request . WP_REST_Server також виконує перевірку автентифікації та перевірки валідації та доступу (validation та permissions).
- WP_REST_Request — цей об’єкт містить відомості про запит , такі як заголовки запиту, параметри та метод, а також маршрут. Він також може перевіряти та очищати запит (validation та sanitization).
- WP_REST_Response – відповідає за відповідь на запит . Встановлює заголовки відповіді, статус, тіло відповіді (JSON). Надає допоміжні методи add_link() (додає пов’язані з відповіддю посилання) та query_navigation_headers() (дані навігації в заголовках).
До класів контролерів відносяться:
- WP_REST_Posts_Controller
- WP_REST_Users_Controller
- …
- Всі класи REST API дивіться тут .
Приклад реєстрації маршруту через клас контролера
Детальний опис цього прикладу дивіться у розділі Створення маршрутів .
Принципи Класів контролерів у WP API
Класи контролерів вирішують дві проблеми при розробці ендпоінтів:
- Відсутність просторів імен WordPress не використовує простору імен PHP (для підтримки PHP 5.2). Обертання групи PHP функцій, які описують кінцеву точку в клас, дозволяє уникнути конфліктів з назвами функцій. Наприклад, ми назвали функцію get_items() і інший розробник зробив те саме, в результаті сайт перестане працювати через фатальну помилку PHP.
- Узгодження структур — Одного разу розібравшись зі структурою класу контролера, розробники зможуть швидко розуміти структуру класу контролера, яку писав інший.
Для класів контролерів розробниками створено спеціальний шаблон: абстрактний клас WP_REST_Controller . На основі рекомендується створювати свої контролери маршрутів. Так, наприклад, всі класи кінцевих точок WP розширюють WP_REST_Controller , наприклад:
class WP_REST_Posts_Controller extends WP_REST_Controller { // ... }
Методи класу-шаблону WP_REST_Controller :
Метод | Опис методу |
---|---|
register_routes() | викликається при першому створенні екземпляра класу та реєструє маршрути. |
get_items() | отримує колекцію ресустів (постів, рубрик тощо). |
get_item() | отримує окремий ресурс (пост, рубрику тощо). Якщо ресурсу не існує, буде повернено статус HTTP 404. Якщо немає права переглядати ресурс, то статус буде 403. |
create_item() | створює новий ресурс. Якщо створення пройшло успішно, WP_REST_Response поверне HTTP статус 201 і посилання на створений ресурс. Якщо створення не вдалося, то буде повернено відповідний код помилки в заголовку HTTP. |
update_item() | оновлює наявний ресурс. |
delete_item() | видаляє наявний ресурс. Якщо видалення не вдалося, то буде повернено відповідний код помилки в заголовку HTTP. |
get_items_permissions_check() | перед викликом коллбек функції перевіряє, чи є право у поточного запиту отримувати колекцію ресурсів. |
get_item_permissions_check() | перед викликом коллбек функції перевіряє, чи є право у поточного запиту отримувати окремий ресурс. |
create_item_permissions_check() | перед викликом коллбек функції перевіряє чи є право у поточного запиту створювати ресурс. |
update_item_permissions_check() | перед викликом коллбек функції перевіряє, чи є право у поточного запиту оновлювати ресурс. |
delete_item_permissions_check() | перед викликом коллбек функції перевіряє чи є право у поточного запиту видаляти ресурс. |
prepare_item_for_response() | змінює дані ресурсу, щоб підходили під схему відповіді. |
prepare_response_for_collection() | prepare_item_for_response() повертає об’єкт WP_REST_Response . Це допоміжна функція, яка збирає такі відповіді у загальну колекцію ресурсів та повертає цю колекцію як відповідь. |
filter_response_by_context() | фільтрує дані ресурсу відповідно до зазначеного параметра context . |
get_item_schema() | одержує об’єкт схеми ресурсу. |
Нотатка про успадкування класів
Не слід зловживати успадкуванням класів . Наприклад: якщо ми написали клас контролера для ендпоінту записів (приклад вище) і хочемо також підтримувати довільні типи записів, то не слід розширювати свій клас My_REST_Posts_Controller таким чином:
class My_CPT_REST_Controller extends My_REST_Posts_Controller { ... }
Замість цього потрібно створити окремий клас контролера, або змусити My_REST_Posts_Controller обробляти всі доступні типи записів. Справа в тому, що батьківський клас (той, що успадковується) може змінитися, а наші підкласи залежать від нього, в результаті отримуємо головний біль. Тому якщо потрібна загальна структура для класів, необхідно створити свій базовий клас контролера у вигляді інтерфейсу або абстрактного класу, а потім використовувати його як основу для підкласів. Такий підхід абстрактного класу використовують у багатьох кінцевих точках REST API WordPress. Наприклад, класи WP_REST_Controller .