wizards/rest-api

一套帮助您创建美观REST API的服务

0.9.0 2021-01-17 22:08 UTC

README

一个基于 fractal 的无框架PHP库,帮助您构建美观的REST API。

Build Status

目标

主要目标是提供一个易于使用且功能强大的REST API库,能够无缝集成到现代框架中。

该范式的阅读方式如下

  • 一个方法将请求一个给定的资源(通常是一个控制器),发送一个 http 请求,我们将它 解析 以找到标准化的参数。资源是一个数据对象,您可以从中获取数据存储 - 作为集合或条目。这些资源可以有关联关系,可以进行筛选,可以修改,...
  • 该库将根据给定的 对象管理器(类似于orm,odm)和请求获取资源
  • 然后根据提供的 对象读取器(有多种配置资源的方式,例如doctrine注释,配置文件等)将数据转换为标准化的资源
  • 然后使用适当的 转换器 将找到的资源发送到fractal以进行序列化到指定的输出格式。

安装

composer require wizards/rest-api

用法

该库的约定基于 jsonapi

查询参数

RestQueryParser 预期这些查询参数

  • 集合

    • 排序
      • name 按升序名称排序
      • -name 按降序名称排序
      • 示例: ?sort=-date
    • filter 通过值筛选资源。
      • 多个筛选值应以逗号分隔提供。
      • 示例: ?filter[name]=dupont,dupond&filter[surname]=thomas
    • filteroperator
      • 更改默认筛选操作符从 = 到其他。
      • 可用操作符: <><=>=!=in
      • 示例: ?filter[age]=18&filteroperator[age]=>
    • include 包括关联数据。
      • 示例: /books?include=author,editor
    • limit:每页要查看的结果数量。
    • page:页码。从1开始。
  • 单个资源

    • include 包括关联数据。示例: /books/1?include=author,editor

示例

纯PHP

<?php

namespace App\Controller;

use Psr\Http\Message\ServerRequestInterface;
use WizardsRest\ObjectManager\ArrayObjectManager;
use WizardsRest\CollectionManager;
use WizardsRest\Provider;
use WizardsRest\Serializer;
use WizardsRest\ObjectReader\ArrayReader;
use WizardsRest\Paginator\ArrayPagerfantaPaginator;
use Symfony\Component\Routing\RouterInterface;
use WizardsRest\Transformer\ArrayTransformer;

Class BookController {
    private $source = [
        ['name' => 'Book 1', 'author' => 'Author 1', 'editor' => 'Editor 1'],
        ['name' => 'Book 2', 'author' => 'Author 2', 'editor' => 'Editor 2'],
	];
    
	// Books controller. Somehow, this is called
    public function getBooks(RouterInterface $router, ServerRequestInterface $request) {
        // Fetch
        $objectManager = new ArrayObjectManager();
        $paginator = new ArrayPagerfantaPaginator($router);
        $collectionManager = new CollectionManager($paginator, $objectManager);
        $collection = $collectionManager->getPaginatedCollection($this->source, $request);
        
        // Transform
        $fractalManager = new \League\Fractal\Manager();
        $reader = new ArrayReader();
        $provider = new Provider(new ArrayTransformer(), $fractalManager, $reader);
        $resource = $provider->transform($collection, $request, null, 'books');
        
        // Serialize
        $serializer = new Serializer($fractalManager, 'https://mysite.com');
        return $serializer->serialize($resource, Serializer::SPEC_DATA_ARRAY, Serializer::FORMAT_ARRAY);
    }
}

Symfony

请参阅 Wizards Technologies' REST API Bundle 上的文档

Laravel

我们正在积极寻找laravel开发人员来支持它!

未来计划

  • 添加更多测试
  • 添加稀疏字段集功能
  • 添加如like或between等高级筛选操作符
  • 优化从源获取数据的方式。
  • 考虑序列化组。