gpt4 book ai didi

php - 如何设计不重复的代码来捕捉mvc框架中的错误?

转载 作者:行者123 更新时间:2023-12-03 07:44:37 25 4
gpt4 key购买 nike

假设有一个模型在保存对象时执行一些逻辑。此逻辑由 db-transactions、一些外部服务调用组成。

class ExampleModel {
//some field
//constructor and getters with setters

public function save() {
$db->beginTransaction();
$db->somequery();
$db->anotherone();
$object->externalApiCall();
$object->saveToCache();
}


}

我的问题是捕获错误和回滚的最佳方法是什么?

解决方案#1
捕获模型中的所有内容,在那里回滚,记录一些信息并将错误重新抛出到 Controller 。看起来像这样:
class ExampleModel {
//some field
//constructor and getters with setters

public function save() {
try {
$db->beginTransaction();
$db->somequery();
$db->anotherone();
$object->externalApiCall();
$object->saveToCache();
} catch (DbException $e) {
$db->rollback();
$logger->log($e->getMessage());
throw $e
}
catch (ApiExcetpion $e) {
somelogic();
throw $e;
}
}


}

我对这种方法的主要担心是在编写 try/catch block 时有很多冗余。对于每个复合方法,都会有 try catch block 。

解决方案#2
在模型中抛出错误,并在 Controller 中处理回滚/日志记录等。我不喜欢这个,因为它破坏了 MVC 模式,并且 Controller 变得很胖。

解决方案#3
将错误监听器绑定(bind)到应用程序实例,以便它们根据其逻辑处理异常。例子:
class ExampleModel {
//some field
//constructor and getters with setters

public function save() {
$db->beginTransaction();
$db->somequery();
$db->anotherone();
$object->externalApiCall();
$object->saveToCache();
}


}

$app->bind_error_handler("DbTransactionException", function () {
rollback();
log();
return View::render("some error");
});

我总体上喜欢这种方法,因为没有大量的 try/catch block 。 Controller 很瘦,错误逻辑与其他一切分离。我对最后一种方法的担忧是它是否被认为是最佳实践。这种方法是否灵活,它会给我第一种方法的灵 active 吗?

整体问题:
在 MVC 世界中处理错误(事务性和其他)的最佳实践是什么?我提供的哪种解决方案是最好的?

最佳答案

使用 ORM(如 Doctrine)并让 Unit Of Work照顾交易处理。

所有INSERT/UPDATE/DELETE操作会排队,直到您调用 YOUR_ORM::flush .当发生异常时,事务会自动回滚。

关于php - 如何设计不重复的代码来捕捉mvc框架中的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32991836/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com