model层 自动新增修改用户字段

101 阅读1分钟

核心

1 extend basemodel
2 basemodel的before_insert after_insert方法里面 为obj加入update_user_name add_username
3 如何获取当前登录用户?
3.1 中间件获取接下token 获取userinfo 存储到request['userInfo']中
3.2 自定义request对象,新增代理request,加入setUserinfo getuserinfo方法

extend basemodel

```
<?php

namespace app\model;

use app\dto\PageDto;
use app\Request;
use think\db\BaseQuery;
use think\facade\Db;
use think\model\concern\SoftDelete;

class BaseModel extends \think\Model
{

    use SoftDelete;

    var $id = "";
    protected $convertNameToCamel = true;
    protected $deleteTime = "delete_time";

    protected $autoWriteTimestamp = 'datetime';

    protected $dateFormat = 'Y-m-d H:i:s';


    static function pageList(PageDto $page, BaseQuery $query)
    {
        return $query->page($page->getPageNum(),
            $page->getPageSize()
        );
    }

    public static function onBeforeInsert($obj)
    {
        $request = \request();
        $userInfo = $request->getUserInfo();
        $obj['createUserId'] = $userInfo['id'] ?? '';
        $obj['createUserName'] = $userInfo['username'] ?? '';
        return $obj;
    }

    public static function onBeforeUpdate($obj)
    {
        $request = \request();
        $userInfo = $request->getUserInfo();
        $obj['updateUserId'] = $userInfo['id'] ?? '';
        $obj['updateUserName'] = $userInfo['username'] ?? '';
        return $obj;
    }


}
```

3.2 自定义request对象,新增代理request,加入setUserinfo getuserinfo方法

```
$app= new App();
$app->bind('myrequest', \app\proxy\MyRequest::class);
$request =$app->make('myrequest');
$http =$app->http;
//$request
$response = $http->run($request);

$response->send();

$http->end($response);
```




//MyRequest

class MyRequest extends Request {

    var $userInfo;

    /**
     * @return mixed
     */
    public function getUserInfo()
    {
        return $this->userInfo;
    }

    /**
     * @param mixed $userInfo
     */
    public function setUserInfo($userInfo): void
    {
        $this->userInfo = $userInfo;
    }





}

拦截器 TokenMiddleware

class TokenMiddleware
{
    var $whiteList = [
        "/auth/login",
        '/phpinfo'
    ];

    /*
     * 判断用户是否有token 有登陆过
     * 排除白名单
     * */
    public function handle( $request, \Closure $next)
    {
        $currentUrl = $request->baseUrl();
        Log::info("操作路径 $currentUrl");
        $filterList = array_filter($this->whiteList, function ($str) use ($currentUrl) {
            return $str == $currentUrl;
        });
//        dd($filterList,count($filterList));
        $isyes = count($filterList) > 0;
        if ($isyes) {
            return $next($request);
        }

        $authorizationstr=$request->header('Authorization');
        $token = substr($authorizationstr,7,strlen($authorizationstr));
//        dd($token,is_null($token));
        /* 判断 token 是否可以在 redis找到 */
        if (is_null($token)) {
            return json(['code' => 401, 'message' => '没有token'], 401);
        }
        /*redis 能不能找到东西*/
//        $userFromRedis = Cache::store("redis")->get("token:$token");
        $userFromRedis = RedisService::$client->get("token:$token");
        if (is_null($userFromRedis)) {
            return json(['code' => 401, 'message' => 'token失效'], 401);
        }
        $userFromRedis = json_decode($userFromRedis, true);
        $request->setUserInfo($userFromRedis);
//        $request->setUserInfo=($userFromRedis);
        return $next($request);
    }

}