中间件 从v2.5.11
版本起支持。
中间件主要,用于拦截或过滤应用的请求,并进行必要的业务处理。
中间件主要,由前置/后置方法组成,应用场景与Aop注解中的@AopBefore
、@AopAfter
效果一致,
唯一的区别是,当一个前置逻辑需要绑定多个不同类时,Aop注解将不能很好管理,这时候使用中间件进行绑定,会比Aop注解合适许多。
所有中间件不强制继续\x\Middleware
系统基类,但一般建议继承,\x\Middleware
类提供了一个error()
,当开发者想中断应用继续向下执行时,
可以调用该方法,抛出自定义的提示内容到客户端,该方法兼容了框架中4种不同的服务。
中间件建议(但不强制)统一存放在/box/middleware
目录下, 便于项目管理。
创建一个Auth
中间件,示例:
namespace box\middleware;
use x\Middleware;
class Auth extends Middleware{
/**
* 前置操作
* @todo 无
* @author 小黄牛
* @version v2.5.0 + 2021.07.20
* @deprecated 暂不启用
* @global 无
* @return void
*/
public function handle() {
// 调用error()中断应用向下执行,并抛出msg到客户端
return $this->error('当前请求没有权限!');
// 返回true,应用将继续向下执行
return true;
}
}
handle()
为前置处理入口,end()
为后置处理入口,当中间件创建不同的方法时,应用会自动响应到该方法进行处理。
中间件创建完成后,需要在/config/middleware.php
配置文件中进行绑定操作。
绑定逻辑支持全局绑定、单条路由绑定、前半段路由匹配绑定,具体参考下面场景案例:
return [
// 全局中间件
'*' => [
\box\middleware\Auth::class,
\box\middleware\Check::class,
],
// 匹配中间件,路由前半段是/test/开头的都会绑定到
'/test/*' => [
\box\middleware\Auth::class,
\box\middleware\Test::class,
],
// 单条中间件
'/demo/index' => [
\box\middleware\Auth::class,
\box\middleware\Demo::class,
],
];
注意:单个*
代表全局绑定,而在路由后面使用*
符号则标识前半段路由匹配绑定。
namespace box\middleware;
use x\Middleware;
class Auth extends Middleware{
/**
* 前置操作
* @todo 无
* @author 小黄牛
* @version v2.5.0 + 2021.07.20
* @deprecated 暂不启用
* @global 无
* @return void
*/
public function handle() {
// 获取请求类
$Request = \x\context\Request::get();
// 如果只是单纯用与判断请求值,使用\x\Request类即可
// 判断参数
if (empty($Request->post['sign'])) {
return $this->error('缺少签名');
}
// 如果要修改请求值,需要set回上下文中
$Request->post['user_nick'] = 'sw-x';
\x\context\Request::set($Request);
// 返回true,应用将继续向下执行
return true;
}
}
namespace box\middleware;
use x\Middleware;
class Auth extends Middleware{
/**
* 前置操作
* @todo 无
* @author 小黄牛
* @version v2.5.0 + 2021.07.20
* @deprecated 暂不启用
* @global 无
* @return void
*/
public function handle() {
// 实例化控制器基类
$websocket = new \x\controller\WebSocket();
// 获取请求参数
$param = $websocket->get_data();
// 判断参数
if (empty($param['sign'])) {
return $this->error('缺少签名');
}
// 如果要修改请求值,需要set回上下文中
$param['user_nick'] = 'sw-x';
$websocket->set_data($param);
// 返回true,应用将继续向下执行
return true;
}
}
namespace box\middleware;
use x\Middleware;
class Auth extends Middleware{
/**
* 前置操作
* @todo 无
* @author 小黄牛
* @version v2.5.0 + 2021.07.20
* @deprecated 暂不启用
* @global 无
* @return void
*/
public function handle() {
// 获取请求类
$Controller = \x\context\Container::get('controller_instance');
// 获取请求参数
$param = $Controller->param;
// 判断参数
if (empty($param['sign'])) {
return $this->error('缺少签名');
}
// 如果要修改请求值,需要set回上下文中
$param['user_nick'] = 'sw-x';
$Controller->param = $param;
\x\context\Container::set('controller_instance', $Controller);
// 返回true,应用将继续向下执行
return true;
}
}
namespace box\middleware;
use x\Middleware;
class Auth extends Middleware{
/**
* 前置操作
* @todo 无
* @author 小黄牛
* @version v2.5.0 + 2021.07.20
* @deprecated 暂不启用
* @global 无
* @return void
*/
public function handle() {
// 获取请求类
$Controller = \x\context\Container::get('controller_instance');
// 获取请求参数
$param = $Controller->getData();
// 判断参数
if (empty($param['sign'])) {
return $this->error('缺少签名');
}
// 如果要修改请求值,需要set回上下文中
$param['user_nick'] = 'sw-x';
$Controller->setData($param);
\x\context\Container::set('controller_instance', $Controller);
// 返回true,应用将继续向下执行
return true;
}
}