当前位置: 首页 > 后端技术 > PHP

控制器中ThinkPHP5.1中间件的使用过程

时间:2023-03-29 14:17:37 PHP

控制器中ThinkPHP5.1中间件的使用过程中间件的使用过程和我的步骤描述,希望能帮助到只学php或者想框架的你,和大家交流一下,让自己提高。Thinkphp框架中中间件的作用我已经理解了,就是在请求即将到达应用层之前,用户访问资源时,生成的header或者用户的请求参数,输入post或者get或者其他请求类型,和url路径,包括前或后操作或执行顺序等方案。了解之后感觉这个东西对处理用户请求数据有很大的作用,比直接在controller或者behavior中处理要好很多。(于是我满怀兴奋地阅读了5.1文档手册)。看完文档,按照官方手册的方法,在命令行输入如下代码:phpthinkmake:middlewareCheck这段代码的意思没有问题,就是生产一个middleware目录,新建一个名字asCheckMiddle文件文件内容正常完成,没有任何问题。根据文档要求,将5.1的文档代码完全按照手册复制过来。没有问题。确认它已被保存和任何错误。在这里,我确认一个名为middleware.php的文件位于我的管理模块的根目录中。如下图,这样注册就可以了,那么如果你想使用这个模块下的中间件,就可以使用了。然后我根据文档中的内容,根据controller中间件的内容描述,在controller中添加了如图所示的代码。原来是代码没有执行。我不解地摸了摸自己的头。按照我的理解,应该是,如果这样做的话,应该可以直接应用,但是result对象是空的。无奈之下,我按照自己的理解,停止了中间件中的代码,在看到自己想要看到的内容后,再次测试了自己的$request。我已经看到了我期待已久的东西,我的中间件已经准备好了。至此上面的步骤告诉我第一步已经完成,我现在可以使用一个中间件来做我想做的事了。第一步是把名字改成我这里有三处变化。再次刷新后,发现还能用,肯定运行流畅。这一步我也强化了自己的一些使用思路,比如创建多个中间件,每个controller应该有一个对应的,在这里进行一些自画像的处理,看完手册也可以使用其他各种方法,包括执行顺序的变化,让我感到各种执念。从那以后,代码又变得有点高大上了。第二步,建立功能规则,配合Config配置中的自建文件控制访问**handleheavy编写处理请求对象的操作函数*@paramobjectRequest$request请求对象*@paramobject\Closure$nextresponseobject*@returnarray错误返回信息*code返回码*msg返回信息*data返回data*@returnobjectResponseobject*/publicfunctionhandle($request,\Closure$next){//检查配置看接口服务是否挂起if(true!==Config::get(Request::module().'.'.Request::action().'.'.Request::action().'_api'))//如果结果不符合要求,将返回错误信息exit(json_encode(['code'=>1,'msg'=>'Interface_Pause_service','data'=>'']));//检测配置,是否进行请求校验类型if(false!==Config::get(Request::module().'.'.Request::action().'.'.Request::action().'_request')){//登录请求规则,传入相应的方法,检查接口是否满足请求类$res=self::loginRequestRole(Request::action());//如果结果不符合要求,将返回错误信息if(true!==$res)exit(json_encode(['code'=>1,'msg'=>'Request_Type_Not_Matching','data'=>'']));}//检测配置,是否进行地址限制验证if(false!==Config::get(Request::module().'.'.Request::action().'.'.Request::action().'_address')){//客户端访问地址限制请求规则$res=self::loginAddressDispose(Request::ip());//如果结果不符合要求则返回错误信息if(true!==$res)exit(json_encode(['code'=>1,'msg'=>'Address_Not_Access','data'=>'']));}//格式化处理前台参数$request=self::loginParamDispose(Request::action(),$request);//继续执行,进入controllerreturn$next($request);}/***loginRequestRole请求类型验证*@paramstring$scene根据路径传入方法名*@returnbool验证用户访问的接口是否满足预设请求要求*/protectedstaticfunctionloginRequestRole($scene){switch($scene){//登录页面请求验证case'index':if(Request::isGet())returntrue;否则返回假;休息;//登录接口请求验证case'login':if(Request::isPost()||Request::isAjax()||t::isPjax())返回真;否则返回假;休息;//登录接口请求验证case'resetPassword':if(Request::isPost()||Request::isAjax()||Request::isPjax())returntrue;否则返回假;休息;//默认验证或不存在的场景returndefault:returnfalse;休息;}}/***loginAddressDispose该地址是否允许访问*@paramstring$address需要传入地址地址*@returnstring返回错误信息*@returnbool检测正确返回true*/protectedstaticfunctionloginAddressDispose($address){//读取配置中的设置参数$data=Config::get(Request::module().'.'.Request::action().'.'.Request::action().'_address_data');//如果配置信息的地址列表为空,则无法访问returnif(empty($data))returnfalse;//循环地址列表信息解锁连续地址地址列表foreach($dataas$key=>$val){if($val==$address)returntrue;}//如果继续执行,还是没有return访问returnfalse;}/***loginParamDisposepost内容和格式处理*@paramstring$scene要去的界面名*@paramobject$request请求对象内容*@returnobject返回处理后的请求对象*/protectedstaticfunctionloginParamDispose($scene,$request){switch($scene){//登录页面case'index':break;//登录接口请求参数处理案例'login'://对前端用户传入的参数进行调整转换$request->username=$request->param('user');$request->password=$request->param('pass');$request->captcha=$request->param('code');//进程记住我$remember=$request->param('remember');如果(null===$remember)$request->remember='shut';否则$request->remember='open';休息;//重置密码接口参数处理案例'resetPassword'://对前台用户传入的参数进行调整转换$request->username=$request->param('user');$request->phone=$request->param('手机');$request->phonecode=$request->param('code');$请求->密码d=$request->param('通过');$request->repassword=$request->param('repass');休息;//默认界面或不存在的场景returndefault:break;}return$request;}}至此,一个简单的中间件检测工作就完成了。当然,这种写法是基于固定要求的。比如在多个控制访问中,api请求带上统一的接口,request带上统一的request,这样无论怎样都可以正常需要分开讨论的两个问题是内容配置中需要用到的其实可以继续。第一个问题,中间件不是万能的,它只能做一些请求处理,而且必须参数化。不要做不符合要求的高级验证。这里最常见的事情是做一些预验证以使数据安全或完整。第二个问题就是不要尝试在中间件中做不合时宜的动作,不要在中间件中执行super。复杂的代码,如果用中间件来做超复杂的代码或者超长的计算,我估计会死很多人。我这里说的包括尽量少用自己的函数库定义的函数代码来验证一些避免不了的东西。用过,比如密码加密,类似代码