您现在的位置是:自如初>ThinkPHPThinkPHP
ThinkPHP6使用中间价解决登录后redirect重定向无效的问题
温新
2020-04-21 01:35:09
【ThinkPHP】
3730人已围观
简介作为最常见的功能,ThinkPHP6似乎更出现了BUG一样。当使用Base公共控制器判断没有登录后,使用redirect()进行重定向,此时问题就来了。redirect()尽然不起作用!对于刚刚接触ThinkPHP6的开发人员来说,可能就认为这是ThinkPHP6的BUG。我个人赞同这样的认为!
步骤一:app/admin目录新建middleware.php中间价文件,其内容如下
app/admin/middleware.php
<?php // 作用于admin目录的中间件配置文件 return [ ];
步骤二:app/admin目录下新建middleware文件夹,并在此文件夹下新建登录控制中间价LoginMiddleware.php并编写代码
app/admin/middleware/LoginMiddleware.php
<?php declare(strict_types = 1); namespace app\admin\middleware; use think\facade\Session; /** * Class LoginMiddleware 登录控制中间件 * @package app\admin\middleware */ class LoginMiddleware { public function handle($request, \Closure $next) { // 前置中间价 $adminData = Session::get('adminData'); if(empty($adminData) && !preg_match('/login/i',$request->pathinfo())){ return redirect(url('admin/login/index')); } return $next($request); } public function end(\think\Response $response) { // 回调行为 } }
步骤三:app/admin/middlerware.php文件中注册中间价,使之生效
<?php // 作用于admin目录的中间件配置文件 return [ // 注册 app\admin\middleware\LoginMiddleware::class ];
步骤四:Base控制器中初始化方法
<?php namespace app\admin\controller; use app\BaseController; use think\App; use think\exception\HttpResponseException; use think\facade\Session; /** * Class Base 公共控制器 * @package app\admin\controller */ class Base extends BaseController { // 初始化控制器 public function initialize() { parent::initialize(); } /** * 判断用户是否登录 * @return bool */ public function isLogin() { $adminData = Session::get('adminData'); // 用户未登录返回 false if(empty($adminData)){ return false; } // 用户已登录返回 true return true; } /** * 自定义重定向方法 * @param $args */ public function redirectTo(...$args) { // 此处 throw new HttpResponseException 这个异常一定要写 throw new HttpResponseException(redirect(...$args)); } }
步骤五:Login.php重定向
<?php namespace app\admin\controller; use think\facade\Db; use think\facade\Session; use think\facade\View; use think\Request; /** * Class Login 后台登录 * @package app\admin\controller */ class Login extends Base { public function initialize() { // 用户若已经登录,则重定向到首页 if($this->isLogin()) { return $this->redirectTo(url('index/index')); } } }
至此,使用中间来判断总户是否登录完成。
总结:
1)对比使用Base来看,中间件的步骤四、步骤五这两步都不省略,由此来看,使用中间件来判断用户是否登录并没有减少代码量,反而对于不熟悉中间件的开发人员来说,可能会感到陌生。两种方式如何取舍,就在于自己的选择。
2)这是一个坑,登录时,使用preg_match匹配时一定要注意。步骤二中 !preg_match('/login/i',$request->pathinfo())这一个片段代码因为没有加i而一直无法登录成功,登录就重定向,这个坑坑了我十多分钟,因此使用此方式时一定要带上i,i表示不区分大小写。
3)当习惯了使用Laravel框架时,与此同时又在使用Thinkphp框架,那么下意识就会把两个框架进行对比。当对比后就会发现,ThinkPHP与Laravel根本就没有可比性,Laravel实在是太优雅、太强大了。而ThinkPHP6也是在借鉴学习Laravel。
4)好了,已是深夜了,就记录到这吧。晚安,世界!
我是夕阳何处寻,期待和优秀的你一起同行!
夕阳何处寻
2020年04月21日
很赞哦!(35)