【问题标题】:Run Middleware Before Controller's Constructor On Laravel 5.1?在 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->usernull,但是当我在控制器的方法上执行此操作时,它不为空。

所以:

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)

标签: php laravel laravel-5.1 laravel-middleware dingo-api


【解决方案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();
    }
    

    【讨论】:

      猜你喜欢
      • 2021-07-03
      • 2017-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-06
      • 1970-01-01
      • 2018-05-04
      • 2019-01-02
      相关资源
      最近更新 更多