Skip to content

jeyroik/extas-expands

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

46 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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"
        }
    }
  }
}