2016-04-13 4 views
5

У меня есть промежуточное программное обеспечение, что подтверждает подлинность пользователя JWT с помощью tymon/jwt-auth пакет:Запуск промежуточного программного обеспечения перед конструктором контроллера на 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); 
} 

Тогда у меня есть контроллер, и я хочу, чтобы передать пользователю от промежуточного программного обеспечения в контроллер.

Так что я сделал на контроллере:

public function __construct() 
{ 
    $this->user = \Auth::user(); 
} 

Проблема заключается в том, что $this->user является null, но когда я делаю это по методу контроллера, это не нуль.

Итак:

public function __construct() 
{ 
    $this->user = \Auth::user(); 
} 

public function index() 
{ 
    var_dump($this->user); // null 
    var_dump(\Auth::user()); // OK, not null 
} 

Так что вопрос в том, что __construct работает до промежуточного слоя. Как я могу это изменить или у вас есть другое решение?

Обновление: Я использую dingo/api для маршрутизации, может быть, это ошибка на их стороне?

+0

Вы не можете сделать это. Вы подумали о том, как передать этого пользователя из промежуточного программного обеспечения (а не из контроллера). – num8er

+0

@ num8er Даже когда я передаю параметр '$ user' следующим образом:' $ request-> attributes-> add (compact ('user')); 'Я получаю тот же результат на контроллере, потому что конструктор работает до промежуточное программное обеспечение. (возможно, ошибка dingo/api) – HtmHell

+0

проверить мой ответ – num8er

ответ

0

1) Удалить Ваши промежуточное программное обеспечение от вашего ядра $middleware массива

2) Поместите свой межплатформенный в $routeMiddleware массив с пользовательским именем jwt.auth:

protected $routeMiddleware = [ 
    // ... 
    'jwt.auth' => 'App\Http\Middleware\YourAuthMiddleware' 
]; 

2) Создание BaseController в родительском каталоге контроллера иглы, с функция:

public function __construct() { 
    $this->middleware('jwt.auth'); 
} 

3) Расширьте контроллер иглы от BaseController

4) Сделать __construct функцией контроллера иглы, чтобы выглядеть следующим образом:

public function __construct() { 
    parent::__construct(); 
    $this->user = \Auth::user(); 
}