Laravel包注册异常处理程序

kit*_*sei 6 php service-provider laravel-5

我想知道是否可以在Laravel 5的包中注册第二个异常处理程序.

我有一个包(让我们称之为api-serializer)注册一个中间件来将所有请求转换为JSON(对于一个API)和这个包注册2个助手:success()并且failure()在发生错误时(或不发生)特别处理json.

在我的应用程序异常处理程序中,我执行以

/**
 * Render an exception into an HTTP response.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Exception  $e
 * @return \Illuminate\Http\Response
 */
public function render($request, Exception $e)
{
    return failure($e->getMessage());
}
Run Code Online (Sandbox Code Playgroud)

现在我有第二个包(让我们称之为tumblr-api),它可以进行http调用并引发异常,例如:

throw (new CustomCoolException)->setModel($model);
Run Code Online (Sandbox Code Playgroud)

我想以不同的方式对待这个异常,因为消息位于,$model像这样做:

if ($e instanceof CustomCoolException) {
    return failure($e->getModel()->getMessage());
}
Run Code Online (Sandbox Code Playgroud)

什么我不想做这是我的包例外添加到我的主要异常处理程序,因为他们会紧密绑定.

我既不想在暴露的api-serializersuccess()failure()我的tumblr-api包之间创建依赖关系.

是否有可能从我的api-serializer注册第二个ExceptionHandler或为它的异常添加特定的开关而不改变其他任何东西?

我想让我的tumblr-api包尽可能独立,所以安装它的用户只需注册服务提供商即可!

Tia*_*ves 5

您可以在包的控制器中使用您自己的包的异常处理程序覆盖应用程序的异常处理程序,如下所示:

class YourPackageController extends Controller
{
    public function __construct()
    {
        \App::singleton(
            \Illuminate\Contracts\Debug\ExceptionHandler::class,
            YourExceptionHandler::class
        );
    }
Run Code Online (Sandbox Code Playgroud)

积分转到 Malhal https://laracasts.com/discuss/channels/requests/custom-exception-handler-based-on-route-group