【问题标题】:Can't access user model in middleware无法访问中间件中的用户模型
【发布时间】:2017-11-07 15:23:14
【问题描述】:

我创建了一个自定义中间件,用于检查请求是由拥有资源的用户提交还是由管理员拥有。

Route::middleware(['web', 'selforadmin'])->group(function () {
    Route::post('users/update-account/{id}', 'UsersController@UpdateAccount');
    Route::post('users/update-email/{id}', 'UsersController@UpdateEmail');
    Route::post('users/update-password/{id}', 'UsersController@UpdatePassword');
});

然后是中间件处理程序:

public function handle($request, Closure $next)
{

    print_r($request->all());
    print_r($request->user());

    dd();

    return $next($request);
}

但我不知道为什么这里无法访问用户模型。我读到请求需要首先从网络中间件传递,所以我做了,但仍然无法访问这个中间件。

它在 $request->user() 或 Auth::user() 上给出 null

我使用的是 Laravel 5.4

编辑:

当我看到其他输入时,正在调用中间件。只有 Auth 为空。并且用户已登录。

【问题讨论】:

  • 你试过\Aith::user()auth()->user()吗??
  • 我不需要中间件中的 Auth 外观。根据文档请求应该有用户模型,但是我已经尝试过了,它给出了 null。
  • auth()->id() 呢?您使用的是 laravel 自动生成的身份验证还是自定义身份验证?
  • 默认 Laravel 身份验证。虽然我将用户移动到不同的命名空间,但这应该不是问题,因为我已经在 authconfig 中更新了它。
  • 其他一切正常。它只是这个中间件,我无权访问用户模型。

标签: laravel routing middleware


【解决方案1】:

您不能直接在中间件中使用模型进行访问。您需要在中间件中定义一个terminate 方法,以便在响应发送到浏览器后执行一些处理。

public function terminate($request, $response)
{
    // Your code ...
}

【讨论】:

【解决方案2】:

如果用户未登录,它将始终返回 null。

有两种解决方案。

首先,检查 $request->user() 是否不为空。

public function handle($request, Closure $next)
{

    if($request->user())
    {
        // do your stuff
    }
    else
    {
        // do otherwise
    }
    return $next($request);
}

其次,在您的中间件之前添加 auth 中间件,以确保只允许登录的用户。

Route::middleware(['web', 'auth', 'selforadmin'])->group(function () {
    // .....
}

【讨论】:

  • 使用已登录。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-07
  • 1970-01-01
  • 2017-08-03
  • 2016-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多