webman不支持在控制器中定義中間件,因?yàn)檫w移tp代碼自己實(shí)現(xiàn)了控制器中間件支持,分享同時也請大家指點(diǎn)指點(diǎn)。
貼代碼:
首先創(chuàng)建自己的控制器中間件接口
<?php
namespace app\common\middleware;
use Webman\Http\Request;
use Webman\Http\Response;
interface ControllerMiddlewareInterface
{
/**
* 控制器專用中間件接口
*/
public function process(Request $request): ?Response;
}
創(chuàng)建webman中間件以調(diào)用自己的控制器中間件
<?php
namespace app\common\middleware;
use Webman\Http\Request;
use Webman\Http\Response;
use Webman\MiddlewareInterface;
class ControllerMiddleware implements MiddlewareInterface
{
/**
* 實(shí)現(xiàn)控制器中間件處理
* @param Request $request
* @param callable $handler
* @return Response
*/
public function process(Request $request, callable $handler) : Response
{
$controllerClass = $request->controller;
try{
$middlewareConfig = $controllerClass::middleware;
}catch (\Throwable $e){
//沒有定義控制器中間件
$middlewareConfig = [];
}
if($middlewareConfig){
//如果存在中間件,則調(diào)用控制器中間件
foreach ($middlewareConfig as $middlewareClass) {
/**
* @var ControllerMiddlewareInterface $middleware
*/
$middleware = new $middlewareClass();
//調(diào)用中間件,若有響應(yīng)則中斷請求
if($res = $middleware->process($request)){
return $res;
}
}
}
return $handler($request);
}
}
實(shí)現(xiàn)一個控制器中間件,demo如下
<?php
namespace app\common\middleware;
use Webman\Http\Request;
use Webman\Http\Response;
/**
* 鑒權(quán)中間件
*/
class AuthMiddleware implements ControllerMiddlewareInterface
{
/**
* @param Request $request
* @return Response
*/
public function process(Request $request) : ?Response
{
if($request->isAjax()){
return new Response(200, [], '不允許ajax提交');
}
return null;
}
}
將實(shí)現(xiàn)的控制器中間件添加到控制器中
<?php
namespace plugin\admin\app\controller;
use app\BaseController;
class Index extends BaseController
{
/**
* 控制器中間件
*/
const middleware = [
\app\common\middleware\AuthMiddleware::class
];
public function index()
{
return "hello admin.";
}
}
最后,將webman中間件添加到配置中(middleware.php)
<?php
use App\common\middleware\ControllerMiddleware;
return [
'' => [
//...你的其他中間件配置
//控制器中間件
ControllerMiddleware::class
]
];
差個$handler,我?guī)湍阊a(bǔ)充下
<?php
namespace app\common\middleware;
use Webman\Http\Request;
use Webman\Http\Response;
use Webman\MiddlewareInterface;
class ControllerMiddleware implements MiddlewareInterface
{
/**
* 實(shí)現(xiàn)控制器中間件處理
* @param Request $request
* @param callable $handler
* @return Response
*/
public function process(Request $request, callable $handler): Response
{
$controllerClass = $request->controller;
try {
$middlewareConfig = $controllerClass::middleware;
} catch (\Throwable $e) {
//沒有定義控制器中間件
$middlewareConfig = [];
}
if ($middlewareConfig) {
//如果存在中間件,則調(diào)用控制器中間件
$count = count($middlewareConfig);
$index = 0;
$call = function (Request $request) use (&$call, $middlewareConfig, $handler, $count, &$index) {
$middlewareClass = $middlewareConfig[$index];
$index ++;
$middleware = new $middlewareClass();
return $middleware->process($request, $index == $count ? $handler : $call);
};
return $call($request);
}
return $handler($request);
}
}
一模一樣的手冊有
http://www.wtbis.cn/doc/webman/middleware.html