在Handler.php Laravel中没有处理AuthorizationException

时间:2017-09-15 10:20:05

标签: php laravel-5

您好Laravel 5.4中的异常处理程序有问题。

我在我的控制器中有一个功能,可以检查权限,如:

function foo(){
   try{ 
      $this->authorize("bar", MyClass::class);
   }catch(AuthorizationException $e){

   }
}

在我的handler.php中我有这个:

    namespace App\Exceptions;

use Exception;
use Illuminate\Auth\AuthenticationException;
use Illuminate\Auth\Access\AuthorizationException;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
class Handler extends ExceptionHandler
{
 protected $dontReport = [
        \Illuminate\Auth\AuthenticationException::class,
        \Symfony\Component\HttpKernel\Exception\HttpException::class,
        \Illuminate\Database\Eloquent\ModelNotFoundException::class,
        \Illuminate\Session\TokenMismatchException::class,
        \Illuminate\Validation\ValidationException::class,
    ];
public function render($request, Exception $exception)
    {

        if ($exception instanceof AuthorizationException) {
            if ($request->expectsJson()) {
                return response()->json(['error' => 'Unauthorized.'], 403);
            }
            // TODO: Redirect to error page instead
        }
        return parent::render($request, $exception);
    }
}

但问题是从不调用处理程序。 但如果我这样做:

function foo(){
   try{ 
      throw new AuthorizationException() //test for throw exception
      $this->authorize("bar", MyClass::class);

   }catch(AuthorizationException $e){

   }
}

它将调用处理程序。

那我可以用 $ this-> authorize 处理AuthorizationException吗?

1 个答案:

答案 0 :(得分:0)

现在我已经解决了这个问题: 我创建了一个Custom类,扩展了AuthorizationException,如:

namespace App\Exceptions;
namespace Illuminate\Auth\Access;
use Throwable;
class CustomAuthorizationException extends AuthorizationException
    {
            public function __construct($message = "", $code = 0, Throwable $previous = null)
            {
                throw new AuthorizationException();

            }
    }

在控制器中:

function foo(){
   try{ 

      $this->authorize("bar", MyClass::class);

   }catch(CustomAuthorizationException $e){

   }
}

现在它有效,但我不知道这是不是一个好方法。 这些建议很受欢迎!