中间件处理登陆流程
1、定义中间件
<?php namespace app\middleware; class Check { public function handle($request, \Closure $next) { if ($request->param('name') == 'think') { return redirect('index/think'); } return $next($request); } }
中间件类能够随意命名,中间件的入口执行方法必须是handle
方法,并且第一个参数是Request
对象,第二个参数是一个闭包
。php
2、前置/后置中间件
中间件是在请求具体的操做以前仍是以后执行,彻底取决于中间件的定义自己。
下面是一个前置行为的中间件:web
<?php namespace app\middleware; class Before { public function handle($request, \Closure $next) { // 添加中间件执行代码 return $next($request); } }
下面是一个后置行为的中间件:跨域
<?php namespace app\middleware; class After { public function handle($request, \Closure $next) { $response = $next($request); // 添加中间件执行代码 return $response; } }
3、注册中间件
新版的中间件分为全局中间件
、应用中间件(多应用模式下有效)
、路由中间件
以及控制器中间件
四个组。执行顺序分别为:缓存
全局中间件->应用中间件->路由中间件->控制器中间件session
1. 全局中间件
全局中间件在app
目录下面middleware.php
文件中定义,使用下面的方式:闭包
<?php return [ \app\middleware\Auth::class ];
中间件的注册应该使用完整的类名,若是已经定义了中间件别名(或者分组)则能够直接使用。全局中间件的执行顺序就是定义顺序。app
2. 应用中间件
若是你使用了多应用模式,则支持应用中间件定义,你能够直接在应用目录下面增长middleware.php
文件,定义方式和全局中间件定义同样,只是只会在该应用下面生效。svg
3. 路由中间件
最经常使用的中间件注册方式是注册路由中间件:url
Route::rule('hello/:name','hello')->middleware(\app\middleware\Auth::class);
支持注册多个中间件:spa
Route::rule('hello/:name','hello')->middleware([\app\middleware\Auth::class, \app\middleware\Check::class]);
4. 控制器中间件
支持为控制器定义中间件,只须要在控制器中定义middleware
属性,例如:
<?php namespace app\controller; class Index { protected $middleware = ['auth']; public function index() { return 'index'; } public function hello() { return 'hello'; } }
当执行index控制器的时候就会调用auth
中间件,同样支持使用完整的命名空间定义。
5. 内置中间件
中间件类 | 描述 |
---|---|
think\middleware\AllowCrossDomain | 跨域请求支持 |
think\middleware\CheckRequestCache | 请求缓存 |
think\middleware\LoadLangPack | 多语言加载 |
think\middleware\SessionInit Session | 初始化 |
think\middleware\FormTokenCheck | 表单令牌 |
这些内置中间件默认都没有定义,你能够在应用的middleware.php
文件中、路由或者控制器中定义这些中间件,若是不须要使用的话,取消定义便可。
4、中间件使用 – 后台登陆页面跳转流程
当访问后台主页的时候,若是已经登陆(已记录session)则能够进入注意,不然返回登陆页面;若访问后台登陆页面,若是已经登陆(已记录session)则直接跳转到主页,不然进入登陆页面。
1. 建立Auth中间件
在admin
应用文件夹建立middleware
文件夹,建立Auth.php
中间件文件:
<?php namespace app\admin\middleware; use think\Response; class Auth { public function handle($request, \Closure $next){ // 前置中间件 if(empty(session(config("admin.session_admin"))) && !preg_match("/login/",$request->pathinfo()) ){ return redirect(url('login/index')); } if(!empty(session(config("admin.session_admin"))) && preg_match("/login\/index/",$request->pathinfo())){ return redirect(url('index/index')); } $response = $next($request); // 后置中间件 return $response; } public function end(Response $response){ } }
admin.session_admin
是在admin/config文件夹下配置文件定义的:
admin/config/admin.php
<?php return [ 'session_admin' => 'adminUser' ];
2. 注册应用中间件
在admin
应用目录新建middleware.php
:
<?php return [ \think\middleware\SessionInit::class, app\admin\middleware\Auth::class ];
本文同步分享在 博客“zy1281539626”(CSDN)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。