thinkPHP6重写异常抛出,多应用,利用ExceptionHandle.php和provider.php

在 ThinkPHP 6 中,当你需要在多个应用中重写异常处理方式时,可以分别在应用中的 ExceptionHandle.phpprovider.php 中进行配置。

ExceptionHandle.php 文件用于处理应用程序中的异常,而 provider.php 文件用于设置应用程序中的服务提供者。

以下是一个简单的例子:

假设你正在开发一个名为 myapp 的应用程序,它有三个模块:adminhomeapi。我们想要在应用程序的多个模块中重写异常处理。

  1. 在每个模块下的 ExceptionHandle.php 文件中重写 render 方法:
    // admin/exception/ExceptionHandle.php
    namespace app\admin\exception;
    
    use think\exception\Handle;
    use think\Response;
    
    class ExceptionHandle extends Handle
    {
        public function render($request, \Throwable $e): Response
        {
            // 自定义异常处理方式
            return "Admin 发生了错误:" . $e->getMessage();
        }
    }
    // home/exception/ExceptionHandle.php
    namespace app\home\exception;
    
    use think\exception\Handle;
    use think\Response;
    
    class ExceptionHandle extends Handle
    {
        public function render($request, \Throwable $e): Response
        {
            // 自定义异常处理方式
            return "Home 发生了错误:" . $e->getMessage();
        }
    }
    // api/exception/ExceptionHandle.php
    namespace app\api\exception;
    
    use think\exception\Handle;
    use think\Response;
    
    class ExceptionHandle extends Handle
    {
        public function render($request, \Throwable $e): Response
        {
            // 自定义异常处理方式
            return "API 发生了错误:" . $e->getMessage();
        }
    }
    1. 在每个模块下的 provider.php 文件中注册服务提供者:
      // admin/provider.php
      use app\admin\exception\ExceptionHandle;
      // 注册异常处理器
      \think\facade\Event::listen('HttpException', ExceptionHandle::class);
      \think\facade\Event::listen('Throwable', ExceptionHandle::class);
      
      // home/provider.php
      use app\home\exception\ExceptionHandle;
      // 注册异常处理器
      \think\facade\Event::listen('HttpException', ExceptionHandle::class);
      \think\facade\Event::listen('Throwable', ExceptionHandle::class);
      
      // api/provider.php
      use app\api\exception\ExceptionHandle;
      // 注册异常处理器
      \think\facade\Event::listen('HttpException', ExceptionHandle::class);
      \think\facade\Event::listen('Throwable', ExceptionHandle::class);

在上面的代码中,我们分别在每个应用程序模块下的 ExceptionHandle.php 文件中重写了 render 方法来处理异常,并在每个模块下的 provider.php 文件中注册了对应的服务提供者来监听异常并调用激活对应的异常处理类。

如果你不想在每个应用程序模块下重复创建 ExceptionHandle.phpprovider.php 文件,你可以将它们放在默认模块或者全局中来减少代码重复。

需要注意的是,当更改了应用程序的异常处理方式后,请确保删除相关应用程序的缓存,否则可能仍然调用原来的异常处理类。

© 版权声明
THE END
喜欢就支持一下吧
点赞5
评论 抢沙发

请登录后发表评论

    暂无评论内容