api-skeletons / laravel-hal
Laravel 的超文本应用程序语言
5.0.2
2022-02-01 20:56 UTC
Requires
- php: ^8.0
- kylekatarnls/update-helper: ^1.2.1
- laravel/framework: ^8.0 || ^9.0
- nesbot/carbon: ^2.30
Requires (Dev)
- doctrine/coding-standard: ^8.2
- php-coveralls/php-coveralls: ^2.4
- phpunit/phpunit: ^9.5
- vimeo/psalm: ^4.18
README
HAL - 超文本应用程序语言是一个 JSON 语法,它提供了一种一致且简单的方式,将 HATEOAS - 超文本作为应用状态引擎 - 添加到您的 API 中。此库使得创建 HAL 响应变得简单,包括嵌入数据。
此库由一个填充器管理器组成,您将为想要作为 HAL 服务的类编写填充器。此库的核心是一个资源对象,HAL 资源都附加在这个对象上。
尽管此库是为 Laravel 设计的,但它 不 仅限于 Eloquent。此库可以与任何数据源一起使用,以创建 HAL 响应。
这是 https://tools.ietf.org/html/draft-kelly-json-hal-08 的直接实现
阅读文档
快速查看
return $this->hydratorManager->resource($data) ->addLink('self', route('routeName::fetch', $class->id)) ->addEmbeddedResource('example', $class->example) ->toArray();
快速开始
- 创建填充器管理器
- 为用户类创建填充器
- 为角色类创建填充器
- 将这些组合成一个 HAL 资源,并从控制器操作返回 HAL
创建填充器管理器
namespace App\HAL; use ApiSkeletons\Laravel\HAL\HydratorManager as HALHydratorManager; final class HydratorManager extends HALHydratorManager { public function __construct() { $this->classHydrators = [ \App\Models\Role::class => \App\HAL\Hydrator\RoleHydrator::class, \App\Models\User::class => \App\HAL\Hydrator\UserHydrator::class, ]; }
为用户类创建填充器
namespace App\HAL\Hydrator; use ApiSkeletons\Laravel\HAL\Hydrator; use ApiSkeletons\Laravel\HAL\Resource; use App\Models\User; final class UserHydrator extends Hydrator { public function extract($class): Resource { $data = []; $fields = [ 'id', 'name', 'email', ]; // Extract fields into an array to be used by the resource foreach ($fields as $field) { $data[$field] = $class->$field; } // Create a new resource and assign self link and extract the // roles into an embedded resource. Note `addEmbeddedResources` // is used for arrays and `addEmbeddedResource` is used for classes return $this->hydratorManager->resource($data) ->addLink('self', route('hal/user::fetch', $class->id)) ->addEmbeddedResources('roles', $class->roles) ; } }
为角色类创建填充器
namespace App\HAL\Hydrator; use ApiSkeletons\Laravel\HAL\Hydrator; use ApiSkeletons\Laravel\HAL\Resource; use App\Models\Role; final class RoleHydrator extends Hydrator { public function extract($class): Resource { $data = []; $fields = [ 'id', 'name', 'guard_name', ]; // Extract fields into an array to be used by the resource foreach ($fields as $field) { $data[$field] = $class->$field; } // Create a new resource and assign self link and extract the // roles into an embedded resource. Note `addEmbeddedResources` // is used for arrays and `addEmbeddedResource` is used for classes return $this->hydratorManager->resource($data) ->addLink('self', route('hal/role::fetch', $class->id)) ; } }
将这些组合成一个 HAL 资源,并从控制器操作返回 HAL
public function fetch(User $user, Request $request) { $hydratorManager = new \App\HAL\HydratorManager(); return $hydratorManager->extract($user)->toArray(); }
HAL 响应
{ "_links":{ "self":{ "href":"https://apiskeletons.com/user/1" } }, "id":1, "name":"Tom H Anderson", "email":"tom.h.anderson@gmail.com", "_embedded":{ "roles":[ { "_links":{ "self":{ "href":"https://apiskeletons.com/role/1" } }, "id":1, "name":"admin", "guard_name":"web", } ] } }