PHPackages                             zero0719/hyperf-api - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Framework](/categories/framework)
4. /
5. zero0719/hyperf-api

ActiveLibrary[Framework](/categories/framework)

zero0719/hyperf-api
===================

An api prototype base on hyperf framework.

1.1.4(1y ago)017MITPHPPHP &gt;=7.4

Since Jul 9Pushed 1y ago1 watchersCompare

[ Source](https://github.com/Zero0719/hyperf-api)[ Packagist](https://packagist.org/packages/zero0719/hyperf-api)[ RSS](/packages/zero0719-hyperf-api/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (7)Dependencies (2)Versions (8)Used By (0)

Feature
-------

[](#feature)

- 跨域处理
- 统一响应
- 验证器统一处理
- 业务异常&amp;处理器
- 模型未找到异常处理
- 应用错误统一处理
- JWT验证
- 请求日志记录
- 常用工具类

安装
--

[](#安装)

```
composer require zero0719/hyperf-api
```

### 发布配置文件

[](#发布配置文件)

`php bin/hyperf.php vendor:publish zero0719/hyperf-api`

跨域处理
----

[](#跨域处理)

跨域处理我们只需要在响应的时候给 `response header` 做一定处理就行

修改配置文件中响应的 `header` 信息

`config/autoload/api.php`

```
return [
    'cors' => [
        'headers' => [
            'Access-Control-Allow-Origin' => '*',
            'Access-Control-Allow-Credentials' => true,
            'Access-Control-Allow-Headers' => 'DNT,Keep-Alive,User-Agent,Cache-Control,Content-Type,Authorization'
        ]
    ]
];
```

在中间件配置文件 `http` 模块引入中间件

`config/autoload/middlewares.php`

```
return [
    'http' => [
        \Zero0719\HyperfApi\Middleware\CorsMiddleware::class
    ],
];
```

统一响应
----

[](#统一响应)

在大部分 `api` 中我们都是响应一个 `json` 格式的数据即可

我们约定响应的数据结构为

```
[
    'code' => 0,
    'message' => '1',
    'data' => []
]
```

为什么 `code` 等于 `0` 的时候认为成功，因为这样可以和前端约定，只要是 `0` 都是成功，当 `code` 不为 `0` 的情况再特定处理；如果约定 `1` 为成功，`0` 为失败，当发生其他情况又把大于 `1` 当成失败去处理，理解逻辑上会有点奇怪。

可以选择继承 `Zero0719\HyperfApi\Controller\BaseController`

```
class IndexController extends \Zero0719\HyperfApi\Controller\BaseController
{
    public function index() {
        return $this->success([
            'test' => 1
        ]);
    }
}
```

也可以直接引入 `trait`

```
use Zero0719\HyperfApi\Trait\ResponseTrait;

class Demo {
    use ResponseTrait;

    public function test() {
        return $this->error('错误响应');
    }
}
```

验证器统一处理
-------

[](#验证器统一处理)

当我们使用验证器类注入验证时，验证失败会抛出一个异常，框架提供的异常处理器不能满足我们 `api` 响应的格式，所以在这里我们要重写一个异常处理器，并响应成我们统一的数据格式。

`config/autoload/exceptions.php`

```
return [
    'handler' => [
        'http' => [
            \Zero0719\HyperfApi\Exception\Handler\ValidationExceptionHandler::class,
            .
            .
            .
        ],
    ],
];
```

业务异常&amp;处理器
------------

[](#业务异常处理器)

在业务逻辑中，我们经常会有代码执行逻辑达到某个条件则认为不该继续往下执行了，这种可控的业务逻辑异常，我们统一的抛出异常，然后用统一的异常处理器捕捉处理。

异常类: `Zero0719\HyperfApi\Exception\BusinessException`

`config/autoload/exceptions.php`

```
return [
    'handler' => [
        'http' => [
            \Zero0719\HyperfApi\Exception\Handler\BusinessExceptionHandler::class,
            .
            .
            .
        ],
    ],
];
```

```
class IndexController extends \Zero0719\HyperfApi\Controller\BaseController
{
    public function index()
    {
        $a = 1;

        if ($a == 2) {
            throw new \Zero0719\HyperfApi\Exception\BusinessException('业务逻辑有问题');
        }

        return $this->success();
    }
}
```

模型未找到异常处理
---------

[](#模型未找到异常处理)

当我们使用 `Model::findOrFail($id)` 时如果没有对应的模型，会抛出 `ModelNotFoundException` 错误，因为这个逻辑也比较常用，所以我们统一捕捉这个错误，响应消息为 `资源未找到`

`exceptions.php`

```
return [
    .
    .
    \Zero0719\HyperfApi\Exception\Handler\ModelNotFoundExceptionHandler::class,
    .
]
```

应用错误统一处理
--------

[](#应用错误统一处理)

有些未知的错误我们可能没有捕捉到，`hyperf` 的脚手架项目自带了 `AppExceptionHandler.php`，但是响应的结果并不是我们 `api` 项目想要的，所以在这之前进行了统一处理，响应服务出错的消息，并区分环境记录到日志当中。

`exceptions.php`

```
return [
    .
    .
    \Zero0719\HyperfApi\Exception\Handler\AppExceptionHandler::class,
    .
]
```

JWT 验证
------

[](#jwt-验证)

`json web token` 几乎是开发 `api` 时离不开的一个模块，所以在这里直接把相关的业务嵌套进来

我们使用 `phper666/jwt-auth` 作为基础，详细用法请查看该包[文档](https://github.com/phper666/jwt-auth)

阅读文档可知，用 `Phper666\JWTAuth\Middleware\JWTAuthDefaultSceneMiddleware::class` 中间件就可以进行 `jwt` 授权验证，如果没有通过校验则会抛出 `Phper666\JWTAuth\Exception\JWTException` 或者 `Phper666\JWTAuth\Exception\TokenValidException`，所以我们只需要定义异常处理器捕获这两个异常，并统一响应即可。

`config/autoload/exceptions.php`

```
return [
    'handler' => [
        'http' => [
            .,
            \Zero0719\HyperfApi\Exception\Handler\JWTExceptionHandler::class,
            .,
            .,
            .
        ],
    ],
];
```

抛出的异常中 `400`, `401` 我们直接响应出去，可以和客户端约定当收到这两个码时可以尝试刷新 `token` 的逻辑，或者直接重定向到登录页面。

`Zero0719\HyperApi\Service\TokenService.php` 简单封装了 `jwt` 一些常用的业务，比如生成，销毁，刷新，解析等，对应我们在业务开发时，登录注册返回的 `token`，退出登录时销毁，刷新时销毁并重新生成，解析获取用户生成时的关键数据进行对应的业务处理

```
