api-skeletons/laravel-hal

Laravel 的超文本应用程序语言

5.0.2 2022-02-01 20:56 UTC

This package is auto-updated.

Last update: 2024-09-18 03:12:41 UTC


README

Build Status Code Coverage Documentation Status PHP Version Laravel Version Total Downloads License

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