转发自白狼栈:查看原文

上节课咱们曾经胜利启动了 hyperf,咱们的目标是利用 hyperf 实现一套问答零碎的接口开发。
在开发需要之前,为了让咱们的框架更加欠缺,先看几个问题。

  1. 接口对立响应
  2. 异样类对立解决
  3. 国际化反对
  4. 枚举类和公共函数库的引入

明天咱们先来看第一个问题。

在接口开发中,固定数据结构的响应内容十分有利于客户端解析,所以咱们有必要先定义一套对立响应的数据格式。

例如申请失败时,对立返回

{    "code": 错误码,    "message": "Not Found"}

申请胜利时,对立返回

{    "code": 0,    "data": []}

程序抛出异样时,对立返回,无论是被动抛出还是零碎抛出的异样

{    "code": 错误码,     "message": "xxx"}

来看下实现步骤:

1、Controller 的父类 AbstractController 减少 success 和 fail 办法如下:

public function success($data = []){    return $this->response->json([        'code' => 0,        'data' => $data,    ]);}public function fail($code, $message = ''){    return $this->response->json([        'code' => $code,        'message' => $message,    ]);}

2、App\Controller\IndexController 减少 AutoController 注解以及测试方法如下:

<?phpdeclare(strict_types=1);namespace App\Controller;use Hyperf\HttpServer\Annotation\AutoController;#[AutoController]class IndexController extends AbstractController{    public function info($id)    {        if ($id > 0) {            return $this->success(['info' => 'data info']);        } else {            return $this->fail(500, 'id有效');        }    }}

[AutoController] 参考 https://hyperf.wiki/3.0/#/zh-...

3、容器内重启我的项目

/data/project/questions # php bin/hyperf.php start

4、宿主机内 curl 间接申请测试,后果如下:

curl http://127.0.0.1:9501/index/info?id=1{"code":0,"data":{"info":"data info"}}%curl http://127.0.0.1:9501/index/info?id=0{"code":500,"message":"id有效"}%

回过头来看第一步中咱们在 AbstractController 内减少的 success 和 fail 办法,都是针对 response::json() 办法进行的封装。然而还不够,如果咱们在 非 Controller 的类中(比方前面要讲的异样处理器)也须要调 success 和 fail 办法就比拟难堪了。

上面进行一个简略的优化。

在 app 目录下创立 Components 目录,封装一个独立的 Response 类,专门解决对立响应。

<?phpdeclare(strict_types=1);namespace App\Components;use Hyperf\HttpServer\Contract\ResponseInterface;use Psr\Container\ContainerInterface;class Response{    /**     * @var ContainerInterface     */    protected $container;    /**     * @var ResponseInterface     */    protected $response;    public function __construct(ContainerInterface $container)    {        $this->container = $container;        $this->response = $container->get(ResponseInterface::class);    }    public function success($data = [])    {        return $this->response->json([            'code' => 0,            'data' => $data,        ]);    }    public function fail($code, $message = '')    {        return $this->response->json([            'code' => $code,            'message' => $message,        ]);    }}
容器对象 ContainerInterface 参考 https://hyperf.wiki/3.0/#/zh-...

同时,AbstractController 类中注入的 Response 类批改为 App\Components\Response,如下:

<?phpdeclare(strict_types=1);namespace App\Controller;use App\Components\Response;use Hyperf\Di\Annotation\Inject;use Hyperf\HttpServer\Contract\RequestInterface;use Psr\Container\ContainerInterface;abstract class AbstractController{    #[Inject]    protected ContainerInterface $container;    #[Inject]    protected RequestInterface $request;    #[Inject]    protected Response $response;}
依赖注入参考 https://hyperf.wiki/3.0/#/zh-...

如此一来,咱们在 IndexController::info 办法内的调用也须要更新。

public function info(){    $id = (int) $this->request->input('id', 0);    if ($id > 0) {        return $this->response->success(['info' => 'data info']);    } else {        return $this->response->fail(500, 'id有效');    }}

也就是说前面咱们无论在哪里,只须要注入 App\Components\Response ,都能够间接调用 Response::success(), Response::fail 即可。

看似没有问题,实则漏洞百出。如果程序中被动 throw 你了一个异样,怎么办?

大家能够先本人思考,咱们下节课再持续欠缺。