## 中间件注册方法有3种
<br/>
## 项目配置文件
~~~
// 项目配置文件Conf.php中有一项 MIDDLEWARE 定义项目默认中间件
return [
// 项目默认中间件注册
'MIDDLEWARE' => [
// 前置,值为中间件的方法名
'BEFORE' => [
'before',
// 如果需要传递控制器类中定义的参数则
// 'before(...)'
],
// 后置
'AFTER' => [
'after'
]
],
];
~~~
<br/>
## 路由中指定
~~~
// 定义路由时第三个参数表示需要注册的中间件
// 分组路由因为涉及到多个方法,所以可以指定需要排除执行前置或者后置中间件的方法
Router::group([
'admin\/(.*)'
], [
// 指定该路由使用的前置中间件
'BEFORE' => [
[
'name' => 'before_1(...)',
// 指定需要排除该中间件的控制器方法名
'exclude' => []
],
[
'name' => 'before_2(...)',
// 指定需要排除该中间件的控制器方法名
'exclude' => []
]
],
// 指定该路由使用的后置中间件
'AFTER' => [
[
'name' => 'after_1',
// 指定需要排除该中间件的控制器方法名
'exclude' => []
]
]
]);
~~~
<br/>
## 装饰器
~~~
// 可以直接在控制器方法的注释中添加装饰器来注册中间件
namespace spi;
use spi\Init;
class Demo extends Init{
public function __construct()
{
parent::__construct();
}
/**
* ***************************************************************************
* aaa -- 演示
*
* 说明 :
*
*
* 请求 :
* @method : post
*
* 前置 :
* @before : before
*
* 后置 :
* @after : after
*
* 历史 :
* 2021/10/14 : created
* ***************************************************************************
*/
public function aaa()
{
}
}
~~~
<br/>
## 获取中间件中的返回值
~~~
// 如果在前置中间件中 return 值的话,则可以在控制器方法中获取该值
// 例如,在Middleware.php中创建中间件test
......
/**
* 创建一个中间件
*
* $hash 字符串类型 本次访问的hash值,可用于做缓存的KEY
* $args 参数列表,很多时候我们需要在中间件里使用控制器中定义的私有、公有变量
* 则需要在注册中间件的时候在名称后加“(...)”
*/
public function test($hash, $args = [])
{
// $args['_PARAM']用来获取装饰器中传递的参数
print_r($args['_PARAM']);
// 一系列逻辑处理
$result = ['data' => '处理的结果,需要返回到具体控制器中'];
return $result;
}
// =========================================== //
// 在控制器中注册test前置中间件,控制器默认接收一个参数,就是前置中间件中返回的值
/**
* ***************************************************************************
* --
*
* 说明 :
*
*
* 前置 :
* @before : before_1(...)
*
* 后置 :
*
* 历史 :
* 2021-10-11 : created
* ***************************************************************************
*/
public function aaa(array $result = [])
{
print_r($result);
}
~~~
运行上例的结果就是中间件中return的数组
![](https://box.kancloud.cn/1d34f068d87bba447d9600527b60ed72_548x45.png)
<br/>
## 后置中间件获取所有返回值
~~~
// 后置中间件一般需要获取前置和控制器中的处理结果,加工后再返回json数据出去
// 在控制器中return需要返回的数据,则后置中间件中可以通过第三个参数来获取
/**
* ***************************************************************************
* --
*
* 说明 :
*
*
* 前置 :
* @before before_1(...)
*
* 后置 :
* @after after
*
* 历史 :
* 2021-10-11 : created
* ***************************************************************************
*/
public function index(array $result = [])
{
return ['id' => 1];
}
// 在middleware中创建后置中间件
/**
* 创建一个中间件,默认提供3个参数
*
* $hash 字符串类型 本次访问的hash值,可用于做缓存的KEY
* $args 参数列表,很多时候我们需要在中间件里使用控制器中定义的私有、公有变量
* 则需要在注册中间件的时候在名称后加“(...)”
* $result 服务执行返回的结果,只有注册为后置中间件才有该参数
*/
public function after($hash, $args = [], $result = [])
{
echo '后置中间件';
// 此处的$result就是控制器中返回的 ['id' => 1]
print_r($result);
// 可以在此处对返回的结果加工再处理后统一返回
json($result);
}
~~~
## 立刻结束
~~~
// 在前置中间件中 return TRUE,则可以立刻结束本次调用,不会继续向下执行,可以用于一些权限验证
~~~