在 PHP MVC 应用程序中在哪里捕获异常?

fsa*_*ari 5 php logging exception-handling exception

我有专为练习 OOP 和 MVC 技能而构建的中小型 PHP 应用程序。我有init/bootstrap文件,它调用Router调用Controller -> Service Layer -> Repository (Database),然后将变量发送回View Layer(所有依赖项都使用 DiC/IOC 处理)。

我创建了扩展 Core Exception类的抽象类 BaseException。然后我有不同的异常类 - DatabaseException、FileException 等。

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

示例 2:在我处理文件包含、保存、删除的类中 - 如果发生错误,它会抛出新的 FileException。

在哪里放置 try catch 代码,在 init/bootstrap 文件或 BaseController 中?但是如果 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());
}
Run Code Online (Sandbox Code Playgroud)

还有一个问题,如何记录这些异常(错误),如上面的例子,或者我应该在 BaseException 中注入 Log 类并在那里处理日志记录?

Car*_*cce 2

编辑:

在 Laravel 较新版本中,应用程序错误在类中处理App\Exceptions\Handler

原答案:

与普通 php 一样,您可以在任何需要的地方实现 try/catch。

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

在你的例子中,你似乎想让你的框架在将异常输出到用户界面之前处理异常,就像 Laravel (还有许多其他框架)所做的那样。

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

这是一个基于文档示例的示例:

set_exception_handler(function($exception){

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

});
Run Code Online (Sandbox Code Playgroud)