TP6_基类控制器如何向中间件传参

分享 未结 0 359
JunStar
JunStar VIP9 2020-07-13 02:00:58
悬赏:20积分 收藏
最近已经在着手写LayTp2.0版本。主要是把TP内核升级到6.x.x。
目前写到了后台登录。
需求:
需要判断是否已经有了登录凭证,如果没有登录凭证就跳转至登录界面,如果有登录凭证就把凭证信息传递给控制器使用。
这里牵涉到三个控制器,一个中间件。它们分别是:
后台控制器基类,后台登录控制器,后台首页控制器,权限检测中间件

后台登录控制器和后台首页控制器都集成了后台控制器基类
在基类控制器中,定义了一个属性,
/**
* 无需登录的方法,同时也就不需要鉴权了
* @var array
*/
protected $noNeedLogin = [];
继承了基类的控制器,后台首页控制器和后台登录控制器可以自行定义这个属性,来设置当前控制器哪些方法不需要登录。
基类控制器需要执行Auth权限验证的中间件,用以拦截请求,判断用户是否已经登录。
底部贴出来的代码是已经实现好的。

注意点:
1.TP6中,如果想要拦截请求,返回json数据或者执行页面跳转,均需要在中间件中实现;
2.为了实现把子类控制器设置的属性传递给基类调用的中间件,需要在基类的初始化方法中给$request对象增加属性
这一点就是TP6中,如何在控制器中,直接向他调用的中间件传参的方式。这也是基于PHP是世界上最好的语言才能实现。因为PHP可以动态的增加对象属性。

3.中间件对用户凭证进行判断后,得到的用户对象,需要再次使用
return $next($request, $this->logicUser);
传递给后续控制器进行使用

TP6的机制已经和Laravel很像了,此次升级,也是为了写API接口时能使用到这些好的特性,比如中间件,哈哈- -

后台控制器基类
<?php
/**
* 后台控制器基类
*/

namespace controller;

use app\common\logic\admin\User;
use app\common\middleware\admin\Auth;

class Backend extends Base
{
/**
* 无需登录的方法,同时也就不需要鉴权了
* @var array
*/
protected $noNeedLogin = [];

/**
* 后台用户数据逻辑层
* @var User
*/
protected $logicUser = null;

protected $middleware = [
Auth::class
];

protected function initialize()
{
$this->request->noNeedLogin = $this->noNeedLogin;
$this->_initialize();
}

//初始化
protected function _initialize(){}
}
登录控制器
<?php
/**
* 菜单
*/
namespace app\admin\controller\auth;

use app\common\model\admin\User;
use controller\Backend;
use library\Random;
use library\Token;
use think\facade\Cookie;

class Login extends Backend
{
protected $noNeedLogin = ['*'];

//默认登录界面
public function index(){
return $this->fetch();
}

//登录
public function doLogin(){
//获取表单提交数据
$param = $this->request->param();
//验证表单提交
$validate = new \app\admin\validate\auth\Login;
if (!$validate->check($param)){
return $this->error($validate->getError());
}
//设置登录信息
$user_id = User::where('username','=',$param['username'])->value('id');
$token = Random::uuid();
Token::set($token, $user_id, 24 * 60 * 60 * 3);
return $this->success('登录成功', ['admin_token'=>$token,'url'=>'/admin']);
}
}
后台首页控制器
<?php
namespace app\admin\controller;

use controller\Backend;

class Index extends Backend
{
public function index(){
return $this->fetch();
}
}
权限检测中间件
<?php

namespace app\common\middleware\admin;

use middleware\Base;
use think\facade\Cookie;
use app\common\logic\admin\User;

class Auth extends Base
{
/**
* 后台用户数据逻辑层
* @var User
*/
protected $logicUser = null;

public function handle($request, \Closure $next)
{
$this->logicUser = User::instance();
if ($this->logicUser->isNeedLogin($request->noNeedLogin)) {
$token = $request->server('HTTP_ADMIN_TOKEN', $request->param('admin_token', Cookie::get('admin_token','')));
$this->logicUser->init($token);
if (!$this->logicUser->isLogin()) {
if($request->isAjax()){
return $this->error('登录信息已过期',10401);
}else{
return redirect('/admin/auth.login/index');
}
}
}
return $next($request, $this->logicUser);
}
}
回帖
  • 消灭零回复
本周热议
没有相关数据