对于路由分组下的中间件,不仅可以在路由文件配置,也可以直接在控制器配置
编辑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
请先登录
可以看出,目前中间件的执行顺序是全局->路由分组->控制器
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。