在 Laravel 5.1 上的控制器构造函数之前运行中间件?
Posted
技术标签:
【中文标题】在 Laravel 5.1 上的控制器构造函数之前运行中间件?【英文标题】:Run Middleware Before Controller's Constructor On Laravel 5.1? 【发布时间】:2016-08-05 02:05:19 【问题描述】:我有一个使用 tymon/jwt-auth 包对 JWT 用户进行身份验证的中间件:
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 进行路由,也许是他们这边的错误?
【问题讨论】:
你不能那样做。您已经考虑过如何从中间件(而不是控制器)传递该用户。 @num8er 即使我像这样传递$user
参数:$request->attributes->add(compact('user'));
我在控制器上得到相同的结果,因为构造函数在中间件之前运行。 (可能是 dingo/api 错误)
解决了吗?我很想知道你做了什么。
你解决过这个问题吗?我有同样的问题(使用 Sentinel)
【参考方案1】:
你应该在路由中使用中间件
Route::middleware('jwt.auth')->group(function()
// your routes
);
【讨论】:
【参考方案2】:1) 从内核的$middleware
数组中删除中间件
2) 将您的中间件放入具有自定义名称jwt.auth
的$routeMiddleware
数组中:
protected $routeMiddleware = [
// ...
'jwt.auth' => 'App\Http\Middleware\YourAuthMiddleware'
];
2)在needle控制器的父目录下创建BaseController,功能:
public function __construct()
$this->middleware('jwt.auth');
3) 从 BaseController 扩展指针控制器
4) 让指针控制器的__construct函数看起来像这样:
public function __construct()
parent::__construct();
$this->user = \Auth::user();
【讨论】:
以上是关于在 Laravel 5.1 上的控制器构造函数之前运行中间件?的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 请求:直接在控制器构造函数中注入请求是正确的吗?
如何在 Laravel 和 Lumen 的控制器构造函数中的中间件之后调用方法、函数或初始化类?