1

我正在尝试从用户登录后先前存储的缓存文件中读取一些数据。

如果auth()->attempt($credentials)通过,我将一些用户数据存储到缓存文件中。

$user_id = auth()->user()->id;
$user = User::with(['roles.perms','offices.clients','offices.locations.country'])->find($user_id);
cache()->put('user_'.$user_id.'_data',$user,60);

我想使用该缓存文件,这样我就不必重新运行一些查询来获取与该用户相关的 ID 及其与其他模型的关系。

所以我试图从 GlobalScope 应用函数中的那个文件中读取,假设我想显示用户有办事处的国家。

我试过这个:

public function apply(Builder $builder, Model $model){
    $user_id = auth()->user()->id;
    $user = cache()->get('user_'.$user_id.'_data');
    $countries = [];
    foreach ($user->offices as $office){
        $countries[] = $office->locations[0]->country_id;
    }
    $builder->whereIn($model->getTable().'.id',$countries);
}

如果缓存为空,则返回错误“尝试获取非对象的属性 'offices' ”。

如果我关闭全局作用域,登录,然后将作用域转回,它就可以工作。所以缓存文件是在登录后创建的。

如果我清除缓存并尝试登录(使用全局范围),我会收到错误消息。所以我不确定,但我认为在登录后缓存之前以某种方式添加全局范围。

任何想法如何解决此问题或修改程序。

更新

看起来需要一些时间来创建文件和全局范围以从中读取。我检查是否已经有一个文件,如果没有创建它。在此修改后,它的工作...

我使用模型来创建缓存文件,而不是像以前那样创建身份验证控制器。

if($id=auth()->user()->id){
   if(!Cache::has('user_'.$id.'_data')){
                $user = User::with(['roles.perms','clients','offices.users','offices.employees','offices.clients.clientUsers','offices.locations.country','offices.projects.jobOrders'])->find($id);
                Cache::forever('user_'.$id.'_data',$user);
            }
            if(!auth()->user()->hasRole(['dekra_master_admin'])) {
                static::addGlobalScope(new EmployeeScope);
            }
        }
4

0 回答 0