Download the PHP package xepozz/yii2-api-model-presenter without Composer
On this page you can find all versions of the php package xepozz/yii2-api-model-presenter. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Informations about the package yii2-api-model-presenter
Yii2 Api Model Presenter
Установка
Описание
При работе с API приходится отдавать свойства объектов в виде примиивой структуры JSON или XML.
В Yii2 заложен механизм отображения моделей, как JSON или XML.
Выглядит это так:
Проблемы
- Первая проблема навязанного подхода в том, что модель засоряется знаниями о том, в какую структуру она будет преобразована при сериализации.
-
Вторая проблема появляется тогда, когда есть наследование моделей. \ Пример: \ Существует
common\models\User
,api\modules\chat\models\User
,api\modules\forum\models\User
(крайне не советую разводить такой зоопарк) Все хорошо, если отдавать непосредственно ту модель, которую хотите отобразить. Но если какой-то модуль отдаетcommon\models\User
, вместоapi\modules\chat\models\User
, то приходится идти на хитрости, чтобы отдать нужную структуру в апи. Хитрость обычно такая:Или наоборот, когда нужно вывести структуру описанную в
common\models\User
, вместо той, что заложена вapi\modules\chat\models\User
.Выглядит, как костыль на костыле, если честно.
- Третья проблема вытекает из предыдущей. \
Если используются модели из пунка №2, то плохой программист захочет выводить
api\modules\chat\models\Message
(которая унаследована отcommon\models\Message
), при выводе самой моделиapi\modules\chat\models\User
как связь. \ Но вcommon\models\User
связь прописана наcommon\models\Message
, как быть? Одним пальцем руки происходит override модели в связи на ту, что лежит вapi/...
.
Решение
Способ борьбы с таким предлагаю такой:
Есть класс, в котором описывается всё поведение, которое будет отдаваться в API. \ В данный класс можно загружать любой зоопарк моделей. Структура на выходе будет всегда одинаковая.
Пример
Пример простого использования проксирования объектов.
Пример более продвинутого использования.
Используем презентер связи для ее вывода.
Пример с вариантивным скрытие поля
Развитие
Буду рад всевозможным исправлениям, замечаниям и всевозможным дискуссиям по дальнейшему развитию библиотеки. \ На текущий момент есть план со следующими задачами:
- Нужно написать тесты
- Написать более внятную документацию
- Перевести документацию на английский язык