fabricio872 / api-modeller-bundle
用于将外国API转换为Doctrine-like模型的Symfony组件
Requires
- php: ^7.4|^8.0
- fabricio872/api-modeller: ^2.2.3
- symfony/config: ^4.4|^5|^6
- symfony/dependency-injection: ^4.4|^5|^6
- symfony/serializer-pack: ^1.0
Requires (Dev)
- symfony/phpunit-bridge: ^4.4|^5|^6
- symplify/easy-coding-standard: ^9.4
README
有价值合作伙伴
安装
确保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
当您使用多个资源表示单个模型时,需要此方法,如此示例所示