ThinkPHP6使用中间价解决登录后redirect重定向无效的问题
步骤一: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。
3)当习惯了使用Laravel框架时,与此同时又在使用Thinkphp框架,那么下意识就会把两个框架进行对比。当对比后就会发现,ThinkPHP与Laravel根本就没有可比性,Laravel实在是太优雅、太强大了。而ThinkPHP6也是在借鉴学习Laravel。
4)好了,已是深夜了,就记录到这吧。晚安,世界!
请登录后再评论