ayeaye/api

简单但强大的API框架

1.0.2 2016-02-19 16:24 UTC

README

[PHP >= 5.5] (https://php.ac.cn/) [License: MIT] (https://raw.githubusercontent.com/AyeAyeApi/Api/master/LICENSE.txt) [Version] (https://packagist.org.cn/packages/ayeaye/api) [Build Status] (https://travis-ci.org/AyeAyeApi/Api/branches)

Aye Aye API 是一个用 PHP 编写的微型框架,用于构建 API。它设计得易于使用,开发速度快,可从小型微服务扩展到世界吞噬的巨人。

安装

创建一个项目并包含 Aye Aye。

composer init --require="ayeaye/api ^1.0.0" -n
composer install

快速入门指南

当使用 Aye Aye 时,你几乎所有的工作都会在控制器类中完成。

这是我们的通用 Hello World 控制器

<?php
// HelloWorldController.php

use AyeAye\Api\Controller;

class HelloWorldController extends Controller
{
    /**
     * Yo ho ho
     * @param string $name Optional, defaults to 'Captain'
     * @return string
     */
    public function getAyeAyeEndpoint($name = 'Captain')
    {
        return "Aye Aye $name";
    }
}

控制器包含端点和子控制器。上面的控制器有一个单一的端点 hello,它将响应 HTTP GET 请求。这体现在名称上,其形式为 [verb][Name]Endpoint

端点接受一个参数,name,如果未提供其他值,则默认为 'Captain'。返回值是一个字符串。

API需要一个入口点,这将放在 index.php 中

<?php
// index.php

require_once '../vendor/autoload.php';
require_once 'HelloWorldController.php';

use AyeAye\Api\Api;

$initialController = new HelloWorldController();
$api = new Api($initialController);

$api->go()->respond();

首先我们获取 composer 的自动加载器,以及我们的控制器(我们还没有将其添加到自动加载器中)。我们实例化我们的 HelloWorldController,并将其传递给 Api 对象的构造函数。这成为我们的初始控制器,这是 Aye Aye 需要知道的唯一一个,我们稍后会解释原因。

最后,->go() 方法产生一个响应对象,我们可以用 ->respond() 来响应。

我们可以使用 PHP 内置的服务器来测试它

$ php -S localhost:8000 index.php &

$ curl localhost:8000/aye-aye                 # {"data":"Aye Aye Captain"}
$ curl localhost:8000/aye-aye?name=Sandwiches # {"data":"Aye Aye Sandwiches"}

注意,字符串已被转换为序列化的对象(默认为 JSON,但可以通过 Accept 头或文件后缀选择格式)。

这测试了我们的端点,但如果只是查询 API 的根会发生什么。

$ curl localhost:8000 # {"data":{"controllers":[],"endpoints":{"get":{"aye-aye":{"summary":"Yo ho ho","parameters":{"name":{"type":"string","description":"Optional, defaults to 'Captain'"}},"returnType":["string"]}}}}} 

让我们更仔细地看看返回的字符串。

{
  "data": {
    "controllers": [],
    "endpoints": {
      "get": {
        "aye-aye": {
          "summary": "Yo ho ho",
          "parameters": {
            "name": {
              "type": "string",
              "description": "Optional, defaults to 'Captain'"
            }
          },
          "returnType": [
            "string"
          ]
        }
      }
    }
  }
}

如你所见,它是对我们的控制器结构的说明。我们没有写任何超出预期之外的东西,这对于后端开发人员和 API 的消费者来说都是有意义的。

完成工作后,不要忘记关闭服务器。

$ fg
^C

为什么你应该使用它?

在Aye Aye上进行开发简单、简洁且逻辑清晰。Aye Aye处理请求并将它们发送到适当控制器上的适当端点。这个端点只是一个方法,接受一系列参数并返回一些数据。Aye Aye会计算出如何在请求中找到这些参数,并在返回时格式化数据。它还支持多种数据格式,并会根据用户请求自动切换。

没有冗余。您不需要学习新的数据库工具,或日志接口(假设您知道[PSR-3](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md),您应该知道)或身份验证方法。Aye Aye只提供路由、请求解析和响应处理。您可以随心所欲地使用其他工具。

如果您遵循PSR-4,那么您的API将非常类似于您的目录结构,使维护变得轻而易举。

Aye Aye了解自己。它知道任何控制器上可用的端点和子控制器,通过阅读doc-block注释中的文档,它可以告诉用户这些端点的作用。您只需编写一次文档,Aye Aye就会读取它并告诉用户这些端点的作用以及它们接受的参数。

默认情况下,它可以以json(默认)和xml格式读取和写入数据,尽管可以轻松添加更多格式。它还可以读取GET、POST和HEADER,并对URL别名进行参数化。这些来源的数据会自动传递到您的方法中。

快速入门说明

Aye Aye最重要的强大功能是其控制器。控制器做两件事。它们提供端点,并访问其他控制器。

控制器是扩展AyeAye\Api\Controller的类

端点是控制器上的方法,命名方式为[verb][name]Endpoint(...)

  • [verb]是等待的HTTP动词。
  • [name]是端点的名称。
  • Endpoint实际上是单词“端点”。这有助于我们了解我们正在处理什么。

您可以为方法定义任何喜欢的参数,Aye Aye会自动为您填充。

控制器还可以通过具有如下命名方式的方法引用其他控制器:[name]Controller()

这些方法应返回一个控制器对象,这就是Aye Aye导航API的方式。

“Hello World”控制器

上面我们编写了一个控制器来输出“Hello”。

<?php
// HelloWorldController.php

use AyeAye\Api\Controller;

class HelloWorldController extends Controller
{
    /**
     * Yo ho ho
     * @param string $name Optional, defaults to 'Captain'
     * @return string
     */
    public function getAyeAyeEndpoint($name = 'Captain')
    {
        return "Aye Aye $name";
    }
}

这个控制器中的唯一方法就告诉您所有需要知道的内容。

  • 它会响应发送到hello端点的GET请求。
  • 它接受一个参数,'name',默认为“Captain”。
  • 它返回一个字符串。

那么我们是如何从这些内容,到使用curl发送和接收数据的呢?

当我们创建API对象时,我们传递了一个HelloWorldController对象作为参数,这告诉API这是我们起点。Aye Aye识别getAyeEndpoint作为通过GET请求触发的名为“aye”的端点。

您会注意到我们使用了PHP Doc Block来解释方法的作用。这非常重要。这不仅告诉其他开发者这个端点做什么……还告诉API的用户,他们会以同样的方式使用它。

在快速入门指南中,我们查询了“/”,您会看到API告诉您它有一个名为“aye”的GET端点,它接受一个名为“name”的字符串参数,它使用您为该方法制作的文档来描述所有这些内容!

子控制器

显然,只有一个控制器是非常无用的。要从一个控制器切换到下一个控制器,我们创建一个[name]Controller()方法。这个方法应该返回一个继承自Controller的对象。为了在我们的应用程序快速启动应用程序中演示这一点,我们只需返回$this

<?php
// HelloWorldController.php

use AyeAye\Api\Controller;
 
class HelloWorldController extends Controller
{
    /**
     * Yo ho ho
     * @param string $name Optional, defaults to 'Captain'
     * @returns string
     */
    public function getAyeAyeEndpoint($name = 'Captain')
    {
        return "Aye Aye $name";
    }
    
    /**
     * lol...
     * @returns $this
     */
    public function ayeController()
    {
        return $this;
    }
}

现在当我们的应用程序启动并开始运行时!

$ php -S localhost:8000 public/index.php &
curl localhost:8000/aye/aye/aye/aye/aye-aye?name=Aye%20Aye # {"data":"Aye Aye Aye Aye"}

贡献

Aye Aye是一个开源项目,欢迎贡献。

问题

要报告问题,请在GitHub问题跟踪器上打开一个Issue。

变更

给我发送Pull Request。给我发很多。

我们遵循PSR-1PSR-2编码标准。PHPMD和PHPCS及其规则文件将帮助你在这一过程中得到指导。