У меня есть googled и stackoverflowed (если возможно) для этого вопроса, и не смог найти достаточный ответ succint: (некоторые ref: Laravel 4: при использовании Config :: set для изменения auth.model, тогда Auth :: user ( ) не работает , Laravel 5.2 как использовать config :: set in middleware )
Как я могу успешно установить переменную дважды во время выполнения с помощью Config::set()
в Laravel 5.2. *?
Вот пример того, что я пытался достичь:
У меня есть две таблицы companies
и users
(они оба подключаются с разных маршрутов с помощью JWTAuth). Теперь я хочу получить все записи computers
в этом единственном маршруте Route::get('/computers')
Теперь проблема заключается в том, что я хочу использовать одно и то же промежуточное ПО для этого, но я хочу убедиться, что любой из этих пользователей (например, компания или пользователь) аутентифицирован, прежде чем они смогут получить доступ к этому ресурсу
Вот что я пытался попытаться использовать Config::set()
в моем промежуточном программном обеспечении:
//all.auth middleware public function handle($request, Closure $next) { Config::set('auth.providers.users.model', \App\Company::class); Config::set('jwt.user', \App\Company::class); //check if the request is for company if($company = JWTAuth::toUser(($request->has('token')) ? $request->token : $request->bearerToken())) { return ['COMPANY' => $company]; } //Unfortunately its not company, lets try users Config::set('auth.providers.users.model', \App\User::class); Config::set('jwt.user', \App\User::class); if($user = JWTAuth::toUser(($request->has('token')) ? $request->token : $request->bearerToken())) { return ['USER' => $user]; } throw new NotFoundHttpException('Your account could not be found.'); ............... }
Теперь поведение, которое я заметил, это то, что он успешно изменил модель, которую JWT будет использовать для Company
но не изменил ее на User
если токен, отправленный с запросом, предназначен для User
.
Буду признателен, если кто-то может помочь, понять хотя бы, если это возможно или нет.
Если есть необходимость предоставить больше объяснений, я готов это сделать.
Настройка значений конфигурации несколько раз работает так, как ожидалось. Причина, по которой ваш код не работает, поскольку вы ожидаете, что служба, расположенная за фасадом JWTAuth, будет разрешена только один раз, при первом обращении к ней, используя текущие значения этих двух конфигурационных параметров. Изменение его позже не окажет никакого влияния.
Чтобы добиться того, чего вы хотите, вам нужно сделать контейнер услуг Laravel повторно созданным сервисом с новыми значениями конфигурации. Для этого вам нужно сделать 2 вещи.
Сначала удалите разрешенный экземпляр с фасада, чтобы в следующий раз, когда вы его используете, он извлекает новый экземпляр службы из контейнера службы:
JWTAuth::clearResolvedInstances();
Затем удалите экземпляр службы из контейнера, чтобы его нужно было создать снова с новыми значениями конфигурации:
App::forgetInstance('tymon.jwt.auth');
Добавьте эти 2 строки после того, как вы установите новые значения конфигурации, и в следующий раз, когда вы используете фасад JWTAuth, он должен использовать новую настройку.
Для того, что я могу понять в тот момент, когда вы вызываете JWTAuth Facade во второй раз в своем коде, его собственный экземпляр уже существует в контейнере службы.
JWTAuth не нужно строить и инициализировать в другой раз, поэтому он использует старый экземпляр, который был сконструирован с использованием конфигурации в тот момент, когда вы его назвали в первый раз.
Параметр Config :: set () работает дважды, но экземпляр JWTAuth всегда один и тот же (первый), поэтому я думаю, что вам нужно уничтожить экземпляр JWTAuth перед вторым вызовом на Facade.
Надеюсь это поможет.