我们正在构建一个基于Good old codeigniter框架的PHP应用程序,并且遇到了包含多个模型调用的大规模链式操作的麻烦,这些操作一起是数据库大事务的一部分。
我们希望能够执行一系列操作,并从功能中获取每个操作的状态报告,无论结果如何。
我们的第一个想法是利用PHP5的例外,但由于我们还需要不会破坏脚本执行的状态消息,这是我们提出的解决方案。
它有点像这样:
$sku = $this->addSku( $name );
if ($sku === false) {
$status[] = 'Something gone terrible wrong';
$this->db->trans_rollback();
return $status;
}
$image= $this->addImage( $filename);
if ($image=== false) {
$error[] = 'Image could not be uploaded, check filesize';
$this->db->trans_rollback();
return $status;
}
我们的控制器如下所示:
$var = $this->products->addProductGroup($array);
if (is_array($var)) {
foreach ($var as $error) {
echo $error . '<br />';
}
}
它似乎是一个非常脆弱的解决方案,可以满足我们的需求,但它与现有的纯PHP异常相比,既不可扩展,也无效。
这真的是基于MVC的应用程序通常处理这种东西的方式吗?
谢谢!
更新 做了相当大的谷歌分享,发现这个PHP功能:register_shutdown_function。 这可能是我们正在寻找的吗?我没有想法,也无法按照我们想要的方式工作...... 参考:http://php.net/manual/de/function.register-shutdown-function.php
答案 0 :(得分:2)
您可以在PHP中设置自定义异常处理程序 - http://php.net/manual/en/function.set-exception-handler.php
这将允许脚本继续执行。你可以创建一个将状态记录到数据库中的函数。另一个函数和/或类可以获取这些函数和/或类以更新当前状态报告。如果你抛出一个自定义的exeption,即抛出StatusException,你的自定义处理程序可以获取异常类型并在对其他标准异常执行默认操作时适当地记录它...
除了使用数据库之外,您还可以使用异常处理程序将信息存储到会话对象等中,稍后将仅针对当前会话进行引用。
如果使用异常处理程序是正确的,我仍然不确定,因为我对你要做的事情仍然有点模糊,但我的方法会允许代码执行在处理异常时继续。