我正在尝试从用户登录后从先前存储的缓存文件中读取一些数据。
如果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 apply函数中的该文件中读取数据,可以说我想显示用户拥有办事处的国家/地区。
我尝试过:
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);
}
如果缓存为空,则返回错误“ 试图获取非对象的属性”办公室”。
如果我关闭了全局范围,请登录,然后再将范围重新打开,它就可以工作。因此,缓存文件是在登录后创建的。
如果我清除缓存并尝试登录(使用全局范围),则会收到错误消息。因此,我不确定,但是我认为以某种方式在登录后进行缓存之前执行添加全局范围的操作。
任何想法如何解决此问题或修改程序。
已更新
创建文件和读取全局范围似乎花费了一些时间。我检查是否已经有文件,如果没有创建的话。修改后,它的工作...
我使用Model来创建缓存文件,而不是像以前那样创建auth控制器。
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);
}
}