Esayswoole控制器的使用- Middleware

2020-05-02  本文已影响0人  骑蚂蚁上高速_jun

easyswoole 没有类似 Laravel 框架那样的中间件处理类文件,只存在有控制器基类中
EasySwoole\Http\AbstractInterface\Controller 的请求前方法[ onRequest] 和 请求后方法[ afterAction ]

开发者可以重写这两个方法 也可以实现类似中间件的功能。

<?php

namespace App\HttpController;

use EasySwoole\Http\AbstractInterface\Controller;
/**
 * 控制器基类
 */
class BaseController extends Controller
{
    /**
     * 用户访问 不存在的路由执行
     * 该方法可以做 404
     * @param string|null $action
     */
    protected function actionNotFound(?string $action)
    {
        $this->response()->withStatus(404);
        $this->response()->withHeader("Content-type","text/html;charset=utf-8");
        $this->response()->write("对不起,页面找不到了");
    }

    /**
     * 控制器中的请求前执行的方法
     * 该方法可以做一些鉴权业务
     * 类似前置中间件
     * 返回 true 则可继续执行控制器的,返回false 则不执行控制器方法
     * @param string|null $action
     * @return bool|null
     */
    protected function onRequest(?string $action): ?bool
    {
        // 模拟业务中 get 参数的token=123456 则可以继续执行
        $token = $this->request()->getQueryParam("token");
        if($token == "123456"){
            return true;
        }
        $this->response()->withStatus(401);
        $this->response()->withHeader("Content-type","application/json;chatset=utf-8");
        // 返回客户端 表示无权限访问
        $this->response()->write(json_encode(["code"=>401,"msg"=>"无权限访问"],JSON_UNESCAPED_UNICODE));
        return false;
    }
   /**
     * 控制器方法执行后 的执行方法
     * 该方法 无论是访问路径不存在,还是控制器方法不执行,还是控制器方法异常。都会执行结尾方法
     * @param string|null $actionName
     */
    protected function afterAction(?string $actionName): void
    {
        echo "结尾工作\n";
    }
}
上一篇下一篇

猜你喜欢

热点阅读