Запустить промежуточное ПО перед конструктором контроллера на Laravel 5.1?

У меня есть промежуточное ПО, которое аутентифицирует пользователя JWT с помощью пакета tymon / jwt-auth:

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, но когда я делаю это в методе контроллера, он не равен нулю.

So:

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 для маршрутизации, возможно, это ошибка на их стороне?


person HTMHell    schedule 13.04.2016    source источник
comment
Тебе этого не сделать. Вы думаете, как передать этого пользователя из промежуточного программного обеспечения (не из контроллера).   -  person num8er    schedule 13.04.2016
comment
@ num8er Даже когда я передаю параметр $user следующим образом: $request->attributes->add(compact('user')); Я получаю тот же результат на контроллере, потому что конструктор запускается до промежуточного программного обеспечения. (возможно, ошибка dingo / api)   -  person HTMHell    schedule 13.04.2016
comment
Это было решено? Мне любопытно узнать, что вы сделали.   -  person BlackBurn027    schedule 22.10.2016
comment
Вы когда-нибудь это решали? У меня такая же проблема (использую Sentinel)   -  person Erin    schedule 02.03.2017


Ответы (2)


Вы должны использовать промежуточное ПО в маршрутах

Route::middleware('jwt.auth')->group(function() {
// your routes 
});
person Tiago Mateus    schedule 19.06.2020

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();
}
person num8er    schedule 13.04.2016