加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

在PHP MVC应用程序中捕获异常的位置?

发布时间:2020-12-13 15:57:03 所属栏目:PHP教程 来源:网络整理
导读:我有小/中型 PHP应用程序,用于练习OOP和MVC技能.我有init / bootstrap文件,它调用调用Controller的Router – 服务层 – 存储库(数据库)然后将变量发送回View Layer(使用DiC / IOC处理的所有依赖项). 我创建了扩展Core Exception类的抽象类BaseException.然后
我有小/中型 PHP应用程序,用于练习OOP和MVC技能.我有init / bootstrap文件,它调用调用Controller的Router – >服务层 – >存储库(数据库)然后将变量发送回View Layer(使用DiC / IOC处理的所有依赖项).

我创建了扩展Core Exception类的抽象类BaseException.然后我有不同的异常类 – DatabaseException,FileException等.

触发异常的示例:在数据库层中我尝试从数据库中获取数据,如果失败则会抛出新的DatabaseException.

示例2:在我处理文件包含,保存,删除的类中 – 如果发生错误,则抛出新的FileException.

在init / bootstrap文件中或者在BaseController中放置try catch代码的位置?但是如果Controller失败并且它抛出某种ControllerException会怎样.

在我看来,它可能看起来像这样(init.php文件):

try {
    // create new router
    $router = $container->get('Router');
    $router->import'Config/routes.php');

    // run the router
    $router->route();

    // load controller
    $dispatcher = $container->get('Dispatcher');
    $dispatcher->load();
} catch (DatabaseException $e) {
    echo "Database error!";
    $log->log('Database error',$e->getMessage());
} catch (FileException $e) {
    echo "File error!";
    $log->log('File error',$e->getMessage());
} catch (Exception $e) { // default
    echo "Some exceptional error!";
    $log->log('Default exception',$e->getMessage());
}

还有一个问题,如何记录这些异常(错误),如上例所示,还是应该在BaseException中注入Log类并处理日志记录?

解决方法

与普通的PHP一样,您可以在任何地方实现尝试/捕获.

在我的项目中(作为MVC框架用户),我通常在我的控制器方法中处理异常,因为他们有责任处理应用程序中的进程.但如果需要,我会在中间件甚至模型中实现它,如果我愿意的话.

在你的情况下,似乎你想让你的框架在将它输出到用户界面之前处理异常,就像Laravel(也有许多其他人)那样.

您可以使用PHP中的set_exception_handler()函数完成此操作.

以下是基于docs示例的示例:

set_exception_handler(function($exception){

    //you could write in a log file here for example...
    echo "Uncaught exception: ",$exception->getMessage(),"n";

});

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读