使用Composer从零开发一个简单的restful框架(11)-控制器中间件

对于路由分组下的中间件,不仅可以在路由文件配置,也可以直接在控制器配置

编辑core/Controller.php,内容如下

<?php
namespace core;


class Controller {
    public array $middlewares = [];


    public function __construct(string $method, Request $request, Response $response) {
        $this->applyMiddleware($this->middlewares, $method, $request, $response);
    }


    private function applyMiddleware(array $middlewares, string $method, Request $request, Response $response): void {
        if (!empty($middlewares)) {
            $middleware = array_shift($middlewares);
            $next = function () use ($middlewares, $method, $request, $response) {
                $this->applyMiddleware($middlewares, $method, $request, $response);
            };
            call_user_func_array([new $middleware(), 'handle'], [$request, $response, $next]);
        } else {
            $this->{$method}($request, $response);
        }
    }
}

新建 app/middleware/User.php,内容如下

<?php
namespace app\middleware;

use core\Request;
use core\Response;


class User {
    public function handle(Request $request, Response $response, \Closure $next): void {
        echo 'User(控制器) 中间件 call before<br>';
        $next();
        echo 'User(控制器) 中间件 call after<br>';
    }
}

编辑app/api/User.php,设置中间件

<?php
namespace app\api;

use core\Controller;
use core\Request;
use core\Response;


class User extends Controller {
    public array $middlewares = [\app\middleware\User::class];


    public function login(Request $request, Response $response): void {
        $response->text('from /user/login');
    }

    public function logout(Request $request, Response $response): void {
        $response->text('from /user/logout');
    }
}

测试

浏览器访问http://phpapi.com/user/login或者http://phpapi.com/user/logout,这里随机模拟了登录判断

当登录成功时,会输出

All(全局) 中间件 call before
Group(路由分组) 中间件 call before
User(控制器) 中间件 call before
User(控制器) 中间件 call after
Group(路由分组) 中间件 call before
All(全局) 中间件 call after
from /user/login

当登录失败时,会输出

All(全局) 中间件 call before
Group(路由分组) 中间件 call before
All(全局) 中间件 call after
请先登录

可以看出,目前中间件的执行顺序是全局->路由分组->控制器

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!