将AuthorizeException绑定到自定义Exception(或覆盖AuthorizationException的render方法)

时间:2017-10-02 12:20:27

标签: laravel laravel-5.5

我们现在有自Laravel 5.5之后的异常渲染方法,我想利用它。 所以我想覆盖AuthorizationException,只是重定向到默认页面。问题是,它不起作用。

我们有新的自定义异常

<?php
namespace App\Exceptions;
use Illuminate\Auth\Access\AuthorizationException;

class CustomAuthorizationException extends AuthorizationException
{
    public function render()
    {
        return redirect(route('dashboard'));
    }
}

如果我抛出CustomAuthorizationException,一切正常,重定向就会发生 然后我尝试将正常的AuthorizationException绑定到那个自定义的,但我不知道在哪里。 我试过了两个

$this->app->singleton('\Illuminate\Auth\Access\AuthorizationException', '\App\Exceptions\CustomAuthorizationException');
$this->app->bind('\Illuminate\Auth\Access\AuthorizationException', '\App\Exceptions\CustomAuthorizationException');

分别在AppServiceProvider和bootstrap / app.php中。

任何提示或帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

如果您使用Laravel Gate进行访问控制,则会在特征Illuminate / Auth / Access / HandlesAuthorization中抛出类型'AuthorizationException'的异常。由于它是在框架中完成的,因此无法“覆盖”'AuthorizationException'类并期望框架根据需要抛出自定义异常。

但是,在app / Exception / Handler.php中劫持异常处理有一种解决方法:

class Handler extends ExceptionHandler
{
    public function render($request, Exception $exception)
    {
       if ($exception instanceof AuthorizationException) {
           return (new CustomAuthorizationException)->render();
       }
    }
}

通过在render()函数中添加条件处理程序,“AuthroizationExeption”类型的异常将被重定向到自定义render()函数,在该函数中用户将被重定向到自定义页面。