## 中間件注冊方法有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的數組

<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,則可以立刻結束本次調用,不會繼續向下執行,可以用于一些權限驗證
~~~