bulton-fr/bfw-api

BFW 的 API 模块

2.0.0-rc.11 2016-10-23 00:00 UTC

README

Build Status Coverage Status Scrutinizer Code Quality Latest Stable Version License

用于与 BFW 框架一起使用 API 的模块

安装

您可以使用 composer 获取此模块: composer require bulton-fr/bfw-api @stable

并且安装模块: ./vendor/bin/bfwInstallModules

配置

此模块的所有配置文件将存放在 app/config/bfw-api/。有两个文件需要配置(manifest.json 是用于模块更新系统的)。

首先,配置文件 config.php

  • urlPrefix:API 所用所有 URL 的前缀。
  • useRest:如果 API 将使用 REST 格式
  • useGraphQL:如果 API 将使用 GraphQL 格式。但您目前不能使用它,因为它尚未实现!(问题 #2

接下来,配置文件 routes.php

这是您 API 的所有路由。不应该将写入另一个配置文件的前缀添加到路由 URL 中。有关要使用的路由格式,请参考 routes.php 配置文件中的示例。

注意:如果没有提供方法,则路由将对所有 HTTP 方法(get、set、put 和 delete)做出响应。

使用方法

我将仅解释 REST API,因为 GraphQL API 尚未实现。当它实现时,我将更新此部分。

您将在目录 /src/api/ 中创建 API 类控制器。所有类都应该扩展 \BfwApi\Rest 类。

您将为控制器中使用的每个 HTTP 方法添加一个方法。所有从请求接收的数据都将存在于 $datas 属性中。如果您想返回响应,可以使用 sendResponse(&$response) 方法。此方法将自动检测 HTTP 请求中要使用的响应格式(xml 或 json),并在发送之前将您的响应转换为正确的格式。

示例

配置

return [
    'urlPrefix' => '/api',
    'useRest' => true,
    'useGraphQL' => false
];
return [
    'routes' => [
       '/books/{bookId:\d+}' => [
            'className' => 'Book',
            'method'    => ['GET', 'POST']
        ],
    ]
];

控制器类

namespace Api;

class Book extends \BfwApi\Rest
{
    public function getRequest()
    {
        $returnedDatas = (object) [
            'elements' => (object) [
                'elemA' => [
                    0 => (object) [
                        'elemB' => 'Foo',
                        'elemC' => 'Bar'
                    ],
                    1 => (object) [
                        'elemB' => 'Foz',
                        'elemC' => 'Baz'
                    ]
                ]
            ]
        ];
        
        $this->sendResponse($returnedDatas);
    }
    
    public function postRequest()
    {
        $modele = new \Modeles\Books;
        //We consider to have some checks of the datas here.
        $status = $modele->updateBooks($this->datas);
        
        $response = (object) [
            'status' => $status,
        ];
        $this->sendResponse($response);
    }
}