我正在尝试从用户登录后先前存储的缓存文件中读取一些数据。
如果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);
}
}