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