Tôi có một middleware rằng xác thực người dùng JWT sử dụng tymon/jwt-auth gói:Chạy phần mềm trung gian trước khi xây dựng bộ điều khiển trên 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);
}
Sau đó, tôi có một bộ điều khiển và tôi muốn vượt qua người sử dụng từ các trung gian để điều khiển.
Vì vậy, tôi đã làm trên bộ điều khiển:
public function __construct()
{
$this->user = \Auth::user();
}
Vấn đề là $this->user
là null
, nhưng khi tôi làm điều này trên một phương pháp điều khiển, nó không phải là null.
Vì vậy:
public function __construct()
{
$this->user = \Auth::user();
}
public function index()
{
var_dump($this->user); // null
var_dump(\Auth::user()); // OK, not null
}
Vì vậy, vấn đề là __construct
đang chạy trước khi middleware. Làm thế nào tôi có thể thay đổi điều đó, hoặc bạn có một giải pháp khác?
Cập nhật: Tôi đang sử dụng dingo/api để định tuyến, có thể đó là lỗi về phía họ?
Bạn không thể làm điều đó. Bạn có suy nghĩ về cách chuyển người dùng đó từ phần mềm trung gian (không phải từ bộ điều khiển). – num8er
@ num8er Ngay cả khi tôi chuyển tham số '$ user' như thế:' $ request-> attributes-> add (compact ('user')); 'Tôi nhận được kết quả tương tự trên controller, bởi vì constructor chạy trước middleware. (có thể là lỗi dingo/api) – HtmHell
kiểm tra câu trả lời của tôi – num8er