【问题标题】:Laravel Middleware Error - Call to a member function isBasic() on nullLaravel 中间件错误 - 在 null 上调用成员函数 isBasic()
【发布时间】:2019-12-05 09:29:39
【问题描述】:

我想在用户登录并应用功能时检查用户类型

在我的middleware,我有这个代码

public function handle($request, Closure $next)
{
    $user = Auth::user();
    if ($user->isBasic()) {
        $previous_session = $user->session_id;

        if ($previous_session) {
            \Session::getHandler()->destroy($previous_session);
        }

        Auth::user()->session_id = \Session::getId();
        Auth::user()->save();
        return redirect(route('home'));
    }

    return $next($request);
}

在我的User model,我有这个

public function isBasic()
{
    return $this->role=='basic';
}

我已经在内核中注册了中间件

'basic' => \App\Http\Middleware\CheckSession::class,

然后我像这样将它传递给我的 LoginController

public function __construct()
{
    $this->middleware('basic');
}

但是当它试图访问登录控制器时,它说

在 null 上调用成员函数 isBasic()

我是 Laravel 的初学者,我不知道该怎么做

【问题讨论】:

  • “登录前”表示还没有经过身份验证的用户,因为他们还没有登录,那么既然没有用户要检查,你会检查什么?
  • 我是 Laravel 的新手,所以我想要的是能够在他们登录时进行检查,如果用户类型是基本的,则应该调用中间件中的函数。我知道我做错了什么,这就是我来这里寻求帮助的原因。我尝试在控制器中使用该功能,但它适用于所有用户类型
  • 这是您必须在登录功能本身中检查的内容,类似于authenticated 方法,该方法在他们登录到 LoginController之后被调用
  • 你可以使用 $this->middleware('basic')->except([''showLoginForm' , 'login']);您正在检查经过身份验证的用户,而没有用户登录您的应用

标签: php laravel


【解决方案1】:

这似乎是LoginController 的authenticated 方法的一个很好的候选对象,该方法在用户登录后被调用。

use Illuminate\Http\Request;


/**
 * The user has been authenticated.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  mixed  $user
 * @return mixed
 */
protected function authenticated(Request $request, $user)
{
    if ($user->isBasic()) {
        $previous_session = $user->session_id;

        if ($previous_session) {
            $request->session()->getHandler()->destroy($previous_session);
        }

        $user->session_id = $requset->session()->getId();
        $user->save();

        // do these specific users need to be redirected to somewhere special?
        return redirect()->route('home');
    }
}

如果您愿意,您甚至可以侦听 Auth 事件,只要它不是排队的侦听器。

【讨论】:

  • 是的,这应该是 OP 场景的正确方法,而不是中间件
  • 我认为这个方法仍然记录在案,但目前似乎不在文档中
【解决方案2】:

您应该使用Auth::check() 来确定用户是否经过身份验证

在你的中间件中,你正在做

 $user = Auth::user();
    if ($user->isBasic()) {...}

在这部分中,如果用户未通过身份验证,则 $user 将具有 null 值 您必须检查用户是否经过身份验证。

例如:

public function handle($request, Closure $next)
{
    if(Auth::check()) { //check if the user is logged in or not
        $user = Auth::user();
        if ($user->isBasic()) {
            $previous_session = $user->session_id;

            if ($previous_session) {
                \Session::getHandler()->destroy($previous_session);
            }

            Auth::user()->session_id = \Session::getId();
            Auth::user()->save();
            return redirect(route('home'));
        }
    }

    return $next($request);
}

【讨论】:

  • 我能够在我的控制器中使用您的代码解决我的问题。谢谢。s
猜你喜欢
  • 2018-09-06
  • 2020-07-16
  • 1970-01-01
  • 1970-01-01
  • 2019-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多