2017-11-25 44 views
0

即时通讯工作与laravel 5.5并试图保护api路由。我将'auth'中间件分配给了这条路线,但是当我测试它时,我得到一个InvalidArgumentException又名'Route [登录]未定义'。我不以任何方式回应这条路线,laravel automaticaly试图重定向到这条路线。我发现在文件中的以下代码行“laravel \框架的\ src \照亮\基金会\ \例外Handler.php”:Laravel自动重定向验证异常

/* 
* Convert an authentication exception into a response. 
* 
* @param \Illuminate\Http\Request $request 
* @param \Illuminate\Auth\AuthenticationException $exception 
* @return \Illuminate\Http\Response 
*/ 
protected function unauthenticated($request, AuthenticationException $exception) 
{ 
    return $request->expectsJson() 
       ? response()->json(['message' => $exception->getMessage()], 401) 
       : redirect()->guest(route('login')); 
} 

所以我想知道,什么在全球范围内捕获这个异常每路线的最佳途径?

回答

0

从我的理解来看,它是因为你在路由中添加了一个auth中间件。因此,无论身份验证何时访问路由,路由都将被重定向到默认登录页面name login route

您可以使用以下代码将unauthenticated方法添加到app/Exceptions/Handler.php。因此,如果请求处于API或期望JSON响应,它将给出带有JSON响应的401状态码。如果使用网络路由访问路由,它将被重定向到默认页面。在下面的例子中,我将它重定向到一个登录页面。

注意:此方法存在于app/Exceptions/Handler.php直到laravel 5.4。

protected function unauthenticated($request, AuthenticationException $exception) 
{ 
    if ($request->expectsJson()) { 
     return response()->json(['error' => 'Unauthenticated.'], 401); 
    } 
    return redirect()->guest(('login')); 
} 

不要忘了导入use Illuminate\Auth\AuthenticationException;

编辑:解释的错误Route [login] is not defined。这是因为laravel试图重定向到named route。如果您使用的是laravel auth scaffolding,则此命名路线可用。如果您手动创建功能,即使路线login存在,它应该被命名为login。欲了解更多信息,请参阅https://laravel.com/docs/5.5/routing#named-routes