PHPackages                             xepozz/yii2-api-model-presenter - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [API Development](/categories/api)
4. /
5. xepozz/yii2-api-model-presenter

ActiveYii2-extension[API Development](/categories/api)

xepozz/yii2-api-model-presenter
===============================

The API model presenter.

0.0.1(6y ago)00PHP

Since Feb 5Pushed 6y ago1 watchersCompare

[ Source](https://github.com/xepozz/yii2-api-model-presenter)[ Packagist](https://packagist.org/packages/xepozz/yii2-api-model-presenter)[ RSS](/packages/xepozz-yii2-api-model-presenter/feed)WikiDiscussions master Synced 2d ago

READMEChangelogDependencies (2)Versions (2)Used By (0)

Yii2 Api Model Presenter
========================

[](#yii2-api-model-presenter)

[![Build Status](https://camo.githubusercontent.com/66590732a9feef8175333c0aed9560c925eb8ecb451726187a9798dcdcc6f383/68747470733a2f2f7472617669732d63692e636f6d2f7865706f7a7a2f796969322d6170692d6d6f64656c2d70726573656e7465722e7376673f6272616e63683d6d6173746572)](https://travis-ci.com/xepozz/yii2-api-model-presenter)

Установка
---------

[](#установка)

```
composer req xepozz/yii2-api-model-presenter

```

Описание
--------

[](#описание)

При работе с API приходится отдавать свойства объектов в виде примиивой структуры JSON или XML.

В Yii2 заложен механизм отображения моделей, как JSON или XML.

Выглядит это так:

```
class User extends \yii\db\ActiveRecord
{
    public $firstName;
    public $lastName;

    public function fields()
    {
        return [
            'id' => 'id',
            'name' => function() {
                return $this->firstName . ' ' . $this->lastName;
            },
        ];
    }
}
```

Проблемы
--------

[](#проблемы)

1. Первая проблема навязанного подхода в том, что модель засоряется знаниями о том, в какую структуру она будет преобразована при сериализации.
2. Вторая проблема появляется тогда, когда есть наследование моделей.
    Пример:
    Существует `common\models\User`, `api\modules\chat\models\User`, `api\modules\forum\models\User` (крайне не советую разводить такой зоопарк) Все хорошо, если отдавать непосредственно ту модель, которую хотите отобразить. Но если какой-то модуль отдает `common\models\User`, вместо `api\modules\chat\models\User`, то приходится идти на хитрости, чтобы отдать нужную структуру в апи. Хитрость обычно такая:

    ```
       /** @var $model \common\models\User */
       $model = $someService->getMyUser();

       return \api\modules\chat\models\User::findOne($model->id);
    ```

    Или наоборот, когда нужно вывести структуру описанную в `common\models\User`, вместо той, что заложена в `api\modules\chat\models\User`.

    ```
       /** @var $model \api\modules\chat\models\User */
       $model = $someService->getMyUser();

       return \common\models\User::findOne($model->id);
    ```

    Выглядит, как костыль на костыле, если честно.
3. Третья проблема вытекает из предыдущей.
    Если используются модели из пунка №2, то плохой программист захочет выводить `api\modules\chat\models\Message`(которая унаследована от `common\models\Message`), при выводе самой модели `api\modules\chat\models\User` как связь.
    Но в `common\models\User` связь прописана на `common\models\Message`, как быть? Одним пальцем руки происходит **override** модели в связи на ту, что лежит в `api/...`.

Решение
-------

[](#решение)

Способ борьбы с таким предлагаю такой:

Есть класс, в котором описывается всё поведение, которое будет отдаваться в **API**.
В данный класс можно загружать любой зоопарк моделей. Структура на выходе будет всегда одинаковая.

Пример
------

[](#пример)

##### Пример простого использования проксирования объектов.

[](#пример-простого-использования-проксирования-объектов)

```
use Xepozz\Yii2ApiModelPresenter\ProxyPresenter;

/**
 * @property \common\models\User $record
 */
class UserPresenter extends ProxyPresenter
{
    protected function getFields(): array
    {
        return [
            'first_name',
            'last_name',
            'full_name' => function() {
                return sprintf('%s %s', $this->record->first_name, $this->record->last_name);
            }
        ];
    }
}
```

##### Пример более продвинутого использования.

[](#пример-более-продвинутого-использования)

Используем презентер связи для ее вывода.

```
use Xepozz\Yii2ApiModelPresenter\ProxyPresenter;

/**
 * @property \common\models\User $record
 */
class UserPresenter extends ProxyPresenter
{
    protected function getFields(): array
    {
        return [
            // ...
        ];
    }

    public function getExtraFields(): array
    {
        return [
            'messages' => 'chatMessages',
        ];
    }

    protected function setUpChildDefinitions(): array
    {
        return [
            'chatMessages' => ChatMessagePresenter::class,
        ];
    }
}
```

##### Пример с вариантивным скрытие поля

[](#пример-с-вариантивным-скрытие-поля)

```
use Xepozz\Yii2ApiModelPresenter\ProxyPresenter;

/**
 * @property \common\models\User $record
 */
class UserPresenter extends ProxyPresenter
{
    protected function getFields(): array
    {
        return [
            'id',
            'status',
            'last_visited_at',
        ];
    }

    protected function getIgnoredFields(): array
    {
        return [
            /**
             * Скрываем на "prod" откружении поле email. Используется только для разработки
             */
            'id' => YII_ENV_PROD,
            'last_visited_at' => function() {
                /**
                 * Если статус online, тогда не показываем это поле.
                 */
                return (bool) $this->record->status;
            },
        ];
    }
}
```

Развитие
--------

[](#развитие)

Буду рад всевозможным исправлениям, замечаниям и всевозможным дискуссиям по дальнейшему развитию библиотеки.
На текущий момент есть план со следующими задачами:

- Нужно написать тесты
- Написать более внятную документацию
- Перевести документацию на английский язык

###  Health Score

20

—

LowBetter than 14% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity0

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity46

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

2288d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/c66e7a3533aa307583d595d0f42c70047d45a59768f474e75c190af10534da26?d=identicon)[xepozz](/maintainers/xepozz)

---

Top Contributors

[![xepozz](https://avatars.githubusercontent.com/u/6815714?v=4)](https://github.com/xepozz "xepozz (31 commits)")

---

Tags

responseformatterapiserializermodelconverteryii2presenter

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/xepozz-yii2-api-model-presenter/health.svg)

```
[![Health](https://phpackages.com/badges/xepozz-yii2-api-model-presenter/health.svg)](https://phpackages.com/packages/xepozz-yii2-api-model-presenter)
```

###  Alternatives

[nilportugues/laravel5-json-api

Laravel 5 JSON API Transformer Package

31232.4k1](/packages/nilportugues-laravel5-json-api)[nilportugues/jsonapi-bundle

Symfony 2 &amp; 3 JSON API Transformer Package

11446.0k](/packages/nilportugues-jsonapi-bundle)[nilportugues/json-api

Serializer transformers outputting valid API responses in JSON, JSON API and HAL+JSON API formats.

70106.2k3](/packages/nilportugues-json-api)[nilportugues/hal

HAL+JSON &amp; HAL+XML API transformer outputting valid API responses.

317.7k2](/packages/nilportugues-hal)[dotzero/yii2-amocrm

Расширение для Yii Framework 2 реализующее клиент для работы с API amoCRM

1639.7k](/packages/dotzero-yii2-amocrm)[nilportugues/laravel5-json-api-dingo

Laravel5 JSONAPI and Dingo together to build APIs fast

311.5k](/packages/nilportugues-laravel5-json-api-dingo)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
