在 PHP MVC 应用程序中在哪里捕获异常?
Where to catch exception in PHP MVC application?
我有 small/mid 大小的 PHP 应用程序,用于练习 OOP 和 MVC 技能。我有 init/bootstrap 文件调用 Router 谁调用 Controller -> Service Layer -> Repository (Database) 然后将变量发送回 View Layer(所有依赖项都用 DiC/IOC).
我创建了扩展核心 Exception class 的 抽象 class BaseException。然后我有不同的异常 classes - DatabaseException、FileException 等
Example triggering Exception: 在数据库层我尝试从数据库获取数据,如果失败则抛出新的DatabaseException。
示例 2: 在我处理文件的 classes 中包含、保存、删除 - 如果发生错误,它会抛出新文件异常。
在哪里放置 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());
}
还有一个问题,如何记录这些异常(错误),如上面的示例,或者我应该在 BaseException 中注入 Log class 并在那里处理日志记录?
与普通 php 一样,您可以在任何需要的地方实施 try/catches。
在我的项目中(作为 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";
});
我有 small/mid 大小的 PHP 应用程序,用于练习 OOP 和 MVC 技能。我有 init/bootstrap 文件调用 Router 谁调用 Controller -> Service Layer -> Repository (Database) 然后将变量发送回 View Layer(所有依赖项都用 DiC/IOC).
我创建了扩展核心 Exception class 的 抽象 class BaseException。然后我有不同的异常 classes - DatabaseException、FileException 等
Example triggering Exception: 在数据库层我尝试从数据库获取数据,如果失败则抛出新的DatabaseException。
示例 2: 在我处理文件的 classes 中包含、保存、删除 - 如果发生错误,它会抛出新文件异常。
在哪里放置 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());
}
还有一个问题,如何记录这些异常(错误),如上面的示例,或者我应该在 BaseException 中注入 Log class 并在那里处理日志记录?
与普通 php 一样,您可以在任何需要的地方实施 try/catches。
在我的项目中(作为 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";
});