jeyroik/extas-expands

There is no license information available for the latest version (4.0.1) of this package.

Extas expands package

4.0.1 2020-08-25 16:05 UTC

This package is auto-updated.

Last update: 2024-10-26 01:19:40 UTC


README

PHP Composer codecov.io PHPStan Enabled Latest Stable Version Total Downloads Dependents

Описание

Пакет позволяет создавать распаковывающиеся объекты, т.е. примерно такие:

GET /index Accept: application/json Response:

{
  "app": {
    "name": "example app",
    "expand": ["app.version", "app.player"]
  }
}

GET /index?expand=app.version,app.player Accept: application/json Response:

{
  "app": {
    "name": "example app",
    "version": "1.0",
    "player": {
      "name": "root",
      "title": "...",
      "description": "...",
      "expand": ["player.aliases", "player.identities", "player.settings"]
    },
    "expand": ["app.version", "app.player"]
  }
}

GET /index?expand=app.version,app.player,player.aliases Accept: application/json Response:

{
  "app": {
    "name": "example app",
    "version": "1.0",
    "player": {
      "name": "root",
      "title": "...",
      "description": "...",
      "aliases": ["root", "admin", "authorized"],
      "expand": ["player.aliases", "player.identities", "player.settings"]
    },
    "expand": ["app.version", "app.player"]
  }
}

Применение экспандов

use extas\components\Item;
use extas\components\expands\Expand;
/**
 * @var Psr\Http\Message\RequestInterface $request
 * @var Psr\Http\Message\ResponseInterface $response
 */
$app = new class([
    'name' => 'example app'
]) extends Item {
    protected function getSubjectForExtension() : string{
        return 'app';
    }
};
$expand = new Expand([
    Expand::FIELD__PSR_REQUEST => $request,
    Expand::FIELD__PSR_RESPONSE => $response,
    Expand::FIELD__ARGUMENTS => [
        Expand::ARG__EXPAND => 'app.version'
    ]
]);
$app = $expand->expand($app);

В момент вызова метода expand произойдёт запуск двух стадий:

  • extas.expand.parse : на этой стадии разбирается строка expand из аргументов (Expand::FIELD__ARGUMENTS).
  • extas.expand.app.version : на этой стадии происходит сама распаковка.

В extas-совместимой конфигурации:

{
  "plugins": [
    {
      "class": "\\PluginAppExpandVersion",
      "stage": "extas.expand.app.version"
    }
  ]
}

Результат применения:

use extas\components\Item;
use extas\components\expands\Expand;
/**
* @var Psr\Http\Message\RequestInterface $request
* @var Psr\Http\Message\ResponseInterface $response
*/
$app = new class([
   'name' => 'example app'
]) extends Item {
   protected function getSubjectForExtension() : string{
       return 'app';
   }
};
$expand = new Expand([
   Expand::FIELD__PSR_REQUEST => $request,
   Expand::FIELD__PSR_RESPONSE => $response,
   Expand::FIELD__ARGUMENTS => [
       Expand::ARG__EXPAND => 'app.version'
   ]
]);
$app = $expand->expand($app);

print_r($app->__toArray());

Результат примерно следующий:

Array
(
  "name" => "example app"
  "version" => "1.0"
  "expand" => ["app.version", "app.player"]
)

Плагины из коробки

Пакет из коробки предоставляет два плагина для парсинга:

  • Поддержка вайлдкарда: позволяет использовать экспанды вида app.*, которые распакуют всё, что есть для сущности.
  • Проверка на пустоту: удаляет пустые элементы экспанда

Чтобы подключить эти плагины, их необходимо импортировать:

extas.json

{
  "import": {
    "from": {
        "extas/expands": {
          "plugins": "*"
        }
    },
    "parameters": {
        "on_miss_package": {
          "name": "on_miss_package",
          "value": "continue"
        },
        "on_miss_section": {
          "name": "on_miss_section",
          "value": "throw"
        }
    }
  }
}