我想知道是否可以在Laravel 5的包中注册第二个异常处理程序。
我有一个包(让我们称之为 api-serializer )注册一个中间件,将所有请求转换为JSON(对于API),这个包注册2个助手:success()
和发生错误(或不发生错误)时专门处理json的failure()
。
在我的应用程序异常处理程序中,我执行以下操作:
/**
* 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());
}
现在我有第二个包(让我们称之为 tumblr-api )进行http调用并引发异常,例如:
throw (new CustomCoolException)->setModel($model);
我想以不同的方式对待此异常,因为该消息位于$model
中,请执行以下操作:
if ($e instanceof CustomCoolException) {
return failure($e->getModel()->getMessage());
}
我不想做什么将我的包异常添加到我的主异常处理程序中,因为它们将被紧密绑定。
我既不想在我的 api-serializer 之间创建一个依赖关系,它将success()
和failure()
公开给我的 tumblr-api 包。< / p>
是否有可能从我的 api-serializer 注册第二个ExceptionHandler或为其添加特定的开关而不改变其他任何内容?
我想让我的 tumblr-api 包尽可能独立,所以安装它的用户只需注册服务提供商即可!
答案 0 :(得分:1)
你可以在你的包的控制器中使用你自己的包的异常处理程序覆盖App的异常处理程序,如下所示:
class YourPackageController extends Controller
{
public function __construct()
{
\App::singleton(
\Illuminate\Contracts\Debug\ExceptionHandler::class,
YourExceptionHandler::class
);
}
致信https://laracasts.com/discuss/channels/requests/custom-exception-handler-based-on-route-group
致意