Laravel - Чтение данных из файла кеша внутри функции применения GlobalScope - PullRequest
0 голосов
/ 23 ноября 2018

Я пытаюсь прочитать некоторые данные из кэшированного файла, ранее сохраненного после того, как пользователь вошел в систему.

Если прошло 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);
            }
        }
...