如何从 laravel5 中的中间件抛出禁止的异常?

Posted

技术标签:

【中文标题】如何从 laravel5 中的中间件抛出禁止的异常?【英文标题】:How throw forbidden exception from middleware in laravel5? 【发布时间】:2015-05-02 13:29:36 【问题描述】:

我正在 laravel 5 中编写一个中间件。我想从中间件中抛出一个带有代码 403 的禁止异常。我的中间件功能如下:

use Exception;

public function handle($request, Closure $next)

    if (!Auth::check()) 
        throw new Exception("Access denied", 403);
    
    return $next($request);

我正在从控制器调用我的中间件,我收到代码 500 但不是 403 的错误消息。我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

您可以简单地使用abort() 助手。 (或App::abort()

public function handle($request, Closure $next) 
    if (!Auth::check()) 
        abort(403, 'Access denied');
    
    return $next($request);


您可以通过覆盖render() 来处理App\Exceptions\Handler 内部的这些异常,例如:

public function render($request, Exception $e)

    if($e instanceof HttpException && $e->getStatusCode() == 403)
        return new JsonResponse($e->getMessage(), 403);
        
    return parent::render($request, $e);

【讨论】:

谢谢.. 我正在开发 REST API,所以我想生成 json 响应。这怎么可能? 我想从异常处理程序中捕获所有这些,就像if ($e instanceof ModelNotFoundException || $e instanceof NotFoundHttpException || $e instanceof MethodNotAllowedHttpException) return new JsonResponse($error_response, 404); 它不起作用,但我已经编写了一些我自己的异常类,现在我正在使用相同的类。 你是useSymfony\Component\HttpKernel\Exception\HttpException吗?因为这就是 abort() 抛出的。

以上是关于如何从 laravel5 中的中间件抛出禁止的异常?的主要内容,如果未能解决你的问题,请参考以下文章

java中的异常处理---捕获异常或者抛出异常

java中的异常处理---捕获异常或者抛出异常

Laravel 5刀片在出现错误而不是抛出异常时显示空白页面

Laravel 5.1 - 抛出异常和 abort() 的区别

Spring中如何管理过滤器中抛出的异常?

Laravel 验证器抛出异常而不是重定向回来