Modo di utilizzare Config :: set () due volte in una function

Ho cercato su google e stackover (se puoi) per questa domanda, e non sono riuscito a trovare una risposta sufficiente a sufficienza: (alcuni ref: Laravel 4: quando usi Config :: set per cambiare auth.model quindi Auth :: user ( ) non funziona , Laravel 5.2 come usare config :: set nel middleware )

Come posso impostare correttamente una variabile due volte in fase di esecuzione con Config::set() in Laravel 5.2. *?

Ecco un esempio di ciò che ho cercato di get:

Ho due companies e users tabelle (entrambi accedono da routes diversi con JWTAuth). Ora voglio recuperare tutti computers record del computers su questa singola rotta Route::get('/computers')

Ora il problema è che voglio usare lo stesso middleware per farlo, ma voglio assicurarmi che qualcuno di quegli utenti (cioè azienda o utente) sia autenticato prima di poter accedere a questa risorsa

Ecco cosa ho provato a provare a usare Config::set() nel mio middleware:

 //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.'); ............... } 

Ora, il comportmento che ho notato è che ha modificato con successo il model che JWT avrebbe utilizzato per la Company ma non lo ha modificato in User nel caso in cui il token inviato con la richiesta fosse per un User .

Sarò grato se qualcuno può dare una mano, capire alless se è ansible o less.

Se è necessario fornire ulteriori spiegazioni, sono pronto a farlo.

L'impostazione dei valori di configuration più volte funziona come previsto. Il motivo per cui il codice non funziona come previsto è che il servizio dietro la facciata JWTAuth viene risolto una sola volta, la prima volta che lo si accede, utilizzando i valori correnti di questi 2 parametri di configuration. Cambiarlo in seguito non avrà alcun impatto.

Per get ciò che desideri, devi creare il contenitore dei servizi di Laravel per ricreare il servizio con i nuovi valori di configuration. Per farlo devi fare 2 cose.

Innanzitutto, rimuovere l'istanza risolta dalla facciata in modo che al successivo utilizzo, recuperi la nuova istanza del servizio dal contenitore dei servizi:

 JWTAuth::clearResolvedInstances(); 

Quindi rimuovi l'istanza del servizio dal contenitore in modo che debba essere nuovamente creata con nuovi valori di configuration:

 App::forgetInstance('tymon.jwt.auth'); 

Aggiungi quelle 2 righe dopo aver impostato i nuovi valori di configuration e la prossima volta che utilizzerai la facciata JWTAuth dovrebbe usare la nuova impostazione.

Per quello che posso capire nel momento in cui chiami JWTAuth Facade per la seconda volta nel tuo codice, la sua istanza esiste già nel contenitore del servizio.

JWTAuth non deve essere costruito né inizializzato un'altra volta, quindi usa la vecchia istanza che è stata costruita usando la configuration nel momento in cui l'hai chiamata la prima volta.

Config :: set () funziona due volte, ma l'istanza JWTAuth è sempre la stessa (la prima), quindi penso che devi distruggere l'istanza JWTAuth prima della seconda chiamata alla facciata.

Spero che questo ti aiuti.