因为webman官方文档没有中间件验证指定的控制器的例子,写了一个小例子。
webman使用中间件验证指定的控制器及方法很简单,只需要三部:
1、新建一个中间件文件。
2、配置文件添加全局中间件。
3、指定的控制器中设置不需要验证的方法。
一、新建中间件文件
在"app\middleware"目录下新建文件"LoginCheck.php",主要内容是获取到请求的控制器类名和方法名,echo输出只是测试用,使用的时候注释或者删除,内容如下:
<?php
#验证登录
namespace app\middleware;use ReflectionClass;
use Webman\MiddlewareInterface;
use Webman\Http\Response;
use Webman\Http\Request;class LoginCheck implements MiddlewareInterface
{public function process(Request $request, callable $handler): Response{$controller = $request->controller; //控制器类名$action = $request->action; //控制器方法echo "控制器:".$controller."\n";echo "方法:".$action."\n";if(in_array($controller,["app\controller\AdminController"])){ //在数组中添加需要验证的控制器类名echo "控制器需要验证\n";$reflection = new ReflectionClass($controller); //创建控制器类的反射$noNeedCheckArr = $reflection->getDefaultProperties()['noNeedCheckArr'] ?? []; //获得控制器类中的noNeedCheck方法,如果不存在设置为空数组if (!in_array($action, $noNeedCheckArr)) { //需要检查echo "方法需要验证\n";$admin = session('admin',""); //如果名为admin的sessin不存在则赋值为""if ($admin!="") { //如果不等于空字符串说明已经登录,请求继续向洋葱芯穿越echo "已登录,继续\n";return $handler($request);}else{ //为空字符串说明没登录echo "未登录,重定向登录页\n";return redirect('/admin/login');}}else{ //此方法不需要验证,请求继续向洋葱芯穿越echo "方法不需要验证\n";return $handler($request);}}else{ //控制器不需要验证,请求继续向洋葱芯穿越echo "控制器不需要验证\n";return $handler($request);}}
}
二、配置文件添加全局中间件
配置文件为"config/middleware.php",添加后内容如下:
<?phpreturn ['' => [app\middleware\LoginCheck::class]
];
三、指定的控制器中设置不验证的方法
中间件文件中指定验证的控制器为"app\controller\AdminController",它的文件是"app\controller"目录下的"AdminController.php"
如果想要验证所有的方法,不需要添加"noNeedCheckArr"
<?phpnamespace app\controller;use support\Request;
use support\Response;
use support\View;class AdminController
{protected $noNeedCheckArr = ['login','captcha']; //登录、验证码的方法不需要验证public function index(Request $request){View::assign(['name1' => 'value1','name2'=> 'value2',]);return view('admin/index');}public function login(Request $request){return view('admin/login');}
}