Ho un middleware che autentica un utente JWT utilizzando tymon/jwt-auth pacchetto:Esegui il middleware prima del costruttore del controller su Laravel 5.1?
public function handle($request, \Closure $next)
{
if (! $token = $this->auth->setRequest($request)->getToken()) {
return $this->respond('tymon.jwt.absent', 'token_not_provided', 400);
}
try {
$user = $this->auth->authenticate($token);
} catch (TokenExpiredException $e) {
return $this->respond('tymon.jwt.expired', 'token_expired', $e->getStatusCode(), [$e]);
} catch (JWTException $e) {
return $this->respond('tymon.jwt.invalid', 'token_invalid', $e->getStatusCode(), [$e]);
}
if (! $user) {
return $this->respond('tymon.jwt.user_not_found', 'user_not_found', 404);
}
$this->events->fire('tymon.jwt.valid', $user);
return $next($request);
}
poi ho un controller e voglio passare l'utente dal middleware al controller.
Così ho fatto sul controller:
public function __construct()
{
$this->user = \Auth::user();
}
Il problema è che è $this->user
null
, ma quando faccio questo su un metodo del controller, non è nulla.
Quindi:
public function __construct()
{
$this->user = \Auth::user();
}
public function index()
{
var_dump($this->user); // null
var_dump(\Auth::user()); // OK, not null
}
Quindi il problema è che __construct
è in esecuzione prima del middleware. Come posso cambiarlo o hai un'altra soluzione?
Aggiornamento: sto usando dingo/api per il routing, forse è un errore dalla loro parte?
Non puoi farlo. Hai pensato a come passare quell'utente dal middleware (non dal controller). – num8er
@ num8er Anche quando passo il parametro '$ user' in questo modo:' $ request-> attributes-> add (compatto ('user')); 'Ho lo stesso risultato sul controller, perché il costruttore viene eseguito prima del middleware. (probabilmente errore dingo/api) – HtmHell
verifica la mia risposta – num8er