Я пытаюсь прочитать некоторые данные из кэшированного файла, ранее сохраненного после входа пользователя в систему.
Если 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);
Я хочу использовать этот файл кэша, поэтому мне не нужно повторно запускать некоторые запросы, чтобы связать идентификаторы для этого пользователя и его отношения с другими моделями.
Поэтому я пытаюсь прочитать из этого файла функцию применения 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);
}
Если кеш пуст, возвращается ошибкаПытаясь получить в собственность «офисы» не объект».
Если я отключу глобальную область, войду в систему, а затем снова поверну область, это сработает. Таким образом, файл кэша создается после входа в систему.
Если я очищаю кеш и пытаюсь войти (с глобальной областью действия), я получаю сообщение об ошибке. Поэтому я не уверен, но я думаю, что каким-то образом добавление глобальной области видимости выполняется перед кэшированием после входа в систему.
Любые идеи, как я могу это исправить или изменить процедуру.
ОБНОВЛЕНО
Похоже, что для создания файла и глобальной области видимости потребовалось некоторое время. Я проверяю, есть ли файл уже, если не создать его. После этой модификации его работа …
Я использовал Модель для создания файла кэша, а не контроллера аутентификации, как раньше.
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);
}
}
Задача ещё не решена.
Других решений пока нет …