Intereting Posts
Проблемы с сохранением сеанса, получение PHP Неустранимая ошибка: Исключение выбрано без рамки стека Неизвестно в строке 0 Необычный результат при слиянии двух прозрачных изображений в php Должен ли я пинговать сервер mysql перед каждым запросом? Настройка функций PHP на основе таймера Как отправить динамическое значение массива в другой файл php с помощью jQuery который является лучшим способом получить ip error_get_last () возвращает null после set_error_handler (); php 7.0 CakePHP: изображение внутри ссылки, хотите сделать ссылку на изображение Почему 1234 == '1234 test' оценивается как true? Выпадающее меню Population с помощью json Сервер OAuth.io не обновляет токен Google Получите изображение mimetype из ресурса в PHP / GD? Как вызвать одну функцию контроллера в другом контроллере в codeigniter Как установить PHP 7 (следующее поколение PHP) на Ubuntu Случайный диапазон без дубликатов в PHP

Способ использования Config :: set () дважды в функции

У меня есть 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.

Надеюсь это поможет.