fabricio872/api-modeller-bundle

用于将外国API转换为Doctrine-like模型的Symfony组件

安装数: 1,642

依赖者: 0

建议者: 0

安全性: 0

星标: 0

关注者: 1

分支: 0

开放问题: 0

类型:symfony-bundle

v0.0.8 2022-06-23 13:46 UTC

This package is auto-updated.

Last update: 2024-09-23 18:43:03 UTC


README

GitHub tag (latest by date) GitHub last commit PHP Composer Test and Tag Packagist Downloads GitHub Repo stars

有价值合作伙伴

PhpStorm logo

安装

确保Composer已全局安装,如Composer文档中的安装章节所述。

使用Symfony Flex的应用程序

打开命令行,进入您的项目目录,并执行以下命令

$ composer require fabricio872/api-modeller-bundle

不使用Symfony Flex的应用程序

步骤 1:下载组件

打开命令行,进入您的项目目录,并执行以下命令以下载此组件的最新稳定版本

$ composer require fabricio872/api-modeller-bundle

步骤 2:启用组件

然后,通过将其添加到项目config/bundles.php文件中注册的组件列表中,启用组件

// config/bundles.php

return [
    // ...
    Fabricio872\ApiModeller\ApiModellerBundle::class => ['all' => true],
];

使用方法

此组件使用与Doctrine实体类似的注解模型。

通常它们位于src/ApiModels目录中,但只要它们有正确的命名空间,就无需位于那里。

具有单个资源的示例模型

这是从某个API接收用户列表的模型的示例

// src/ApiModels/Users.php

use Fabricio872\ApiModeller\Annotations\Resource;

/**
 * @Resource(
 *     endpoint="{{api_url}}/api/users",
 *     method="GET",
 *     type="json",
 *     options={
 *          "headers"={
 *              "accept"= "application/json"
 *          }
 *     }
 * )
 */
class Users
{
    public $page;
    public $per_page;
    public $total;
    public $total_pages;
    public $data;
}

endpoint参数是要调用的端点。

{{api_url}}变量是配置在twig配置中的全局变量(例如在全局变量配置部分中的示例)

method参数是执行请求的方法。

默认:GET

type参数定义了接收数据的格式。

目前支持:json"xml'

默认:json

options参数是直接传递到symfony/http-client请求方法作为第3个参数的数组(但可以如setOptions部分中所述进行修改),因此请使用此文档

具有多个资源的示例模型

要定义多个资源,需要将多个Resource注解包裹在单个Resources注解中,并在开始处包含标识符。然后在调用此端点时使用该标识符,如setIdentifier部分中所述。

// src/ApiModels/Users.php

use Fabricio872\ApiModeller\Annotations\Resource;
use Fabricio872\ApiModeller\Annotations\Resources;

/**
 * @Resources({
 *      "multiple"= @Resource(
 *          endpoint="{{api_url}}/api/users",
 *          method="GET",
 *          type="json",
 *          options={
 *              "headers"={
 *                  "accept"= "application/json"
 *              }
 *          }
 *      ),
 *      "single"= @Resource(
 *          endpoint="{{api_url}}/api/users/{{id}}",
 *          method="GET",
 *          type="json",
 *          options={
 *              "headers"={
 *                  "accept"= "application/json"
 *              }
 *          }
 *      ),
 * })
 */
class Users
{
    public $page;
    public $per_page;
    public $total;
    public $total_pages;
    public $data;
}

全局变量配置

# config/packages/twig.yaml

twig:
    ...
    globals:
        api_url: 'https://reqres.in'

调用API

此组件可以从symphony的依赖注入容器中初始化,因此您可以在控制器中这样调用它

调用单个资源

此控制器从此示例中输出命名空间为Users::class的模型或模型集合,并将查询参数page设置为2

// src/Controller/SomeController.php


    /**
     * @Route("/", name="some_controller")
     */
    public function index(Modeller $modeller): Response
    {
        dump($modeller->getData(
            Repo::new(Users::class)
                ->setOptions([
                    "query" => [
                        "page" => 2
                    ]
                ])
        ));

        return $this->render('some_controller/index.html.twig', [
            'controller_name' => 'SomeController',
        ]);
    }

调用多个资源

此控制器从此示例中输出命名空间为Users::class的模型或模型集合,并从模型中填充变量{{id}}的值为2

请注意,现在需要设置setIdentifier方法

// src/Controller/SomeController.php


    /**
     * @Route("/", name="some_controller")
     */
    public function index(Modeller $modeller): Response
    {
        dump($modeller->getData(
            Repo::new(Users::class)
                ->setParameters([
                    "id" => 2
                ])
                ->setIdentifier("single")
        ));

        return $this->render('some_controller/index.html.twig', [
            'controller_name' => 'SomeController',
        ]);
    }

modeller接受一个Repo对象,该对象需要您要构建的模型的命名空间,并具有可选的设置器

  • setOptions()
  • setParameters()
  • setIdentifier()

setOptions

该方法接受一个选项数组,这些选项将与模型中配置的选项合并(并覆盖重叠的参数),作为3号参数用于symfony/http-client请求方法,因此请使用此文档

setParameters

该方法接受一个数组,并将twing变量(与渲染模板时相同,但在这里模板是来自模型的端点参数)设置到URL配置中,并且可以覆盖全局twing变量

setIdentifier

当您使用多个资源表示单个模型时,需要此方法,如此示例所示