【问题标题】:Bind AuthorizeException to custom Exception (or override render method of AuthorizationException)将 AuthorizeException 绑定到自定义异常(或覆盖 AuthorizationException 的渲染方法)
【发布时间】:2018-04-10 14:32:11
【问题描述】:

从 Laravel 5.5 开始,我们现在有了 Exceptions 的渲染方法,我想利用它。 所以我想覆盖 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 中。

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

【问题讨论】:

  • 只需让您的异常处理程序处理该异常,它是一个框架异常,您不是抛出它或控制那里抛出什么的人。无论如何,这些事情都无法从容器中解决。
  • 是的,我们可以这样做(我们在 5.5 之前就这样做了),但是我们将自己的异常重构为 5.5“标准?” (假设是新功能)并希望保持一致。编辑:如果无法扩展默认异常,那么我想别无选择......但必须有办法:/
  • 有人可以帮忙吗?

标签: laravel laravel-5.5


【解决方案1】:

如果您使用 Laravel Gate 进行访问控制,则会在 trait 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() 函数,其中用户将被重定向到自定义页面。

【讨论】:

  • 我知道,这就是我们在 5.4 中所拥有的,所以我想在更新到 5.5 的同时对其进行重组。无论如何谢谢:)
猜你喜欢
  • 1970-01-01
  • 2020-01-24
  • 1970-01-01
  • 1970-01-01
  • 2018-07-16
  • 2018-11-10
  • 1970-01-01
  • 2023-03-25
  • 2017-12-11
相关资源
最近更新 更多