数据库 - Model 前置说明
官方开源项目 抓取代理IP

介绍

中间件 从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,
    ],
];

注意:单个*代表全局绑定,而在路由后面使用*符号则标识前半段路由匹配绑定

HTTP中间件案例

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;
	}
}

WebSocket中间件案例

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;
	}
}

RPC中间件案例

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;
	}
}

MQTT中间件案例

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;
	}
}

SW-X

企业级 - 高性能 PHP 框架

最后更新:2年前 . 作者-小黄牛

本篇目录