ytake / hhypermedia
为 HATEOAS REST Web 服务
0.6.1
2020-07-01 12:28 UTC
Requires
- hhvm: ^4.62
- hhvm/hhvm-autoload: ^3.0
- hhvm/hsl: ^4.0
- hhvm/hsl-experimental: ^4.25
Requires (Dev)
- facebook/fbexpect: ^2.7.3
- hhvm/hacktest: ^2.0.0
- hhvm/hhast: ^4.0.0
README
Hypertext Application Language for HHVM/Hack
支持
HAL - Hypertext Application Language
JSON Hypertext Application Language 草案-kelly-json-hal-08
vnd.error
需求
HHVM 4.0.0 及以上。
1.安装
$ composer require ytake/hhypermedia
2.使用
给定一个 Hack 对象,hal+json 转换器将根据 JSON Hypertext Application Language 草案-kelly-json-hal-08
规范草案表示给定的数据。
基本
use type Ytake\Hhypermedia\Serializer\HalJsonSerializer; use type Ytake\Hhypermedia\Link; use type Ytake\Hhypermedia\LinkResource; use type Ytake\Hhypermedia\Serializer; use type Ytake\Hhypermedia\HalResource; use type Ytake\Hhypermedia\ResourceObject; use type Ytake\Hhypermedia\Visitor\JsonSerializationVisitor; $link = new Link('self', vec[new LinkResource('/users')]); $ro = new ResourceObject() |> $$->withLink($link); $resource = new HalResource($ro, dict['id' => 123456789]); $secondRo = new ResourceObject() |> $$->withEmbedded('tests', vec[$resource]); $hal = new HalResource($secondRo); $s = new Serializer( new HalJsonSerializer(), $hal, new JsonSerializationVisitor() ); echo $s->serialize();
基本 - 结果
{ "_embedded":{ "tests":[ { "id":123456789, "_links":{ "self":{ "href":"\/tests" } } } ] } }
Curies
use type Ytake\Hhypermedia\Link; use type Ytake\Hhypermedia\Curie; use type Ytake\Hhypermedia\CurieResource; use type Ytake\Hhypermedia\LinkResource; use type Ytake\Hhypermedia\Serializer; use type Ytake\Hhypermedia\HalResource; use type Ytake\Hhypermedia\ResourceObject; use type Ytake\Hhypermedia\Serializer\HalJsonSerializer; use type Ytake\Hhypermedia\Visitor\JsonSerializationVisitor; $ro = new ResourceObject() |> $$->withLink(new Link('self', vec[new LinkResource('/tests')])) |> $$->withLink(new Curie(vec[ new CurieResource('http://haltalk.herokuapp.com/docs/{rel}', shape('name' => 'heroku')) ])); $s = new Serializer( new HalJsonSerializer(), new HalResource($ro), new JsonSerializationVisitor() ); echo $s->serialize();
Curies - 结果
{ "_links":{ "self":{ "href":"\/tests" }, "curies":[ { "href":"http:\/\/haltalk.herokuapp.com\/docs\/{rel}", "templated":true, "name":"heroku" } ] } }
3.vnd.error
支持 vnd.error。
use type Ytake\Hhypermedia\Serializer; use type Ytake\Hhypermedia\LinkResource; use type Ytake\Hhypermedia\Error\ErrorLink; use type Ytake\Hhypermedia\Error\MessageResource; use type Ytake\Hhypermedia\ResourceObject; use type Ytake\Hhypermedia\Serializer\VndErrorSerializer; use type Ytake\Hhypermedia\Visitor\JsonSerializationVisitor; $linkVec = vec[new LinkResource('http://...')]; $new = new ResourceObject() |> $$->withLink( new ErrorLink('help', $linkVec)) |> $$->withLink( new ErrorLink('about', $linkVec)) |> $$->withLink( new ErrorLink('describes', $linkVec)); $s = new Serializer( new VndErrorSerializer(), new MessageResource( 'Validation failed', $new, shape('logref' => 42, 'path' => '/username') ), new JsonSerializationVisitor() ); \var_dump($s->toDict());
vnd.error - toDict
dict[ 'message' => 'Validation failed', 'logref' => 42, 'path' => '/username', '_links' => dict[ 'help' => dict[ 'href' => 'http://...' ], 'about' => dict[ 'href' => 'http://...' ], 'describes' => dict[ 'href' => 'http://...' ], ] ]
vnd.error - 结果
{ "message": "Validation failed", "path": "/username", "logref": 42, "_links": { "about": { "href": "http://..." }, "describes": { "href": "http://..." }, "help": { "href": "http://..." } } }