Laravel 5.5 $exception instanceof AuthenticationException 未按预期工作

zyc*_*zyc 2 php authentication exception instanceof laravel

伙计们。我是 Laravel 的新手。刚刚安装了 5.5 并尝试在App\Exceptions\Handler中捕获 AuthenticationException,如下所示

public function render($request, Exception $exception)
{
    if ($exception instanceof AuthenticationException) {
        //Do something
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是 ($exception instanceof AuthenticationException) 总是返回 false。

dd($exception instanceof AuthenticationException) //return false.
Run Code Online (Sandbox Code Playgroud)

当我 dd($exception) 时我得到了

AuthenticationException{
    #gurad...
    ....
    .....
}
Run Code Online (Sandbox Code Playgroud)

然后我尝试

get_class($exception) return \Illuminate\Auth\AuthenticationException
Run Code Online (Sandbox Code Playgroud)

然而,

dd($exception instanceof Exception) //return true.
Run Code Online (Sandbox Code Playgroud)

请帮忙。谢谢。

Mar*_*łek 5

您应该确保使用有效名称空间中的类:

public function render($request, Exception $exception)
{
    if ($exception instanceof \Illuminate\Auth\AuthenticationException) {
        //Do something
    }

    return parent::render($request, $exception);
}
Run Code Online (Sandbox Code Playgroud)

您提到:

dd($exception instanceof Exception) //返回 true。

这是真的。每个扩展 Exception 类的异常类都会为此返回 true,这就是为什么在处理程序中您应该确保首先验证特定类而不是异常类,例如,如果您使用:

public function render($request, Exception $exception)
{
    if ($exception instanceof Exception) {
        //Do something 1
    }
    if ($exception instanceof \Illuminate\Auth\AuthenticationException) {
        //Do something 2
    }

    return parent::render($request, $exception);
}
Run Code Online (Sandbox Code Playgroud)

总是//Do something 1会先启动。