在 Codeigniter 中捕获 Doctrine 异常的最佳方法
Posted
技术标签:
【中文标题】在 Codeigniter 中捕获 Doctrine 异常的最佳方法【英文标题】:Best way to catch Doctrine Exceptions in Codeigniter 【发布时间】:2011-07-18 13:34:42 【问题描述】:您认为在 codeigniter 框架中捕获所有学说 1.2 ORM 异常的最佳方法是什么,我不想用 try catch 包装整个 index.php,但也不想在每个查询之前和之后进行 try catch ,
【问题讨论】:
如果不是这两个,您会想到哪些其他选项?你已经尝试过这些吗?index.php
有什么不好?
【参考方案1】:
嗯,首先,您必须在index.php
中只换行。实际上,如果您有不想显示的异常(例如在生产环境中),这可能会很好。
这里的第二点是你的数据库相关代码应该集中在模型中。所以你可能会引入辅助类,类似于
class SafeQueryHelper
public static function safeQueryRun(Doctrine_Query $q, array $parameters, $hydration=Doctrine_Core::HYDRATE_RECORD)
try
return $q->execute($parameters, $hydration);
catch(Exception $e)
//Handle yur exceptions here
您只需将所有模型中的$query->execute($params,$hydration)
替换为SafeQueryHelper::safeQueryRun($query,$params,$hydration)
。不要忘记使用$this->load->helper('SafeQueryHelper')
或the config 加载它。
对于像 update
和 delete
这样的记录方法 - 您必须将其包装在 try .. catch
中。
好吧,如果您没有将与数据库相关的逻辑集中在模型中...实际上这不会改变任何事情,但这意味着您的应用程序设计不佳,违反了MVC
模式的基本原则,所以开始重构吧。
最后可能的解决方案 - 是侵入 Doctrine 核心类(特别是进入 Doctrine_Connection
)并包装到执行实际查询的 try ... catch
行中。但这是个坏主意,我真的不会那样做。
一点更新:由于所有 Doctrine 实体对象都是 Doctine_Record
的子类,您可以使用包装 save
、delete
等的方法扩展 SafeQueryHelper
:
public static function SafeSave(Doctrine_Record $entity)
try
$entity->save();
catch(Exception $e)
//catch it
而不是将$entity->save()
替换为SafeQueryHelper::SafeSave($entity)
【讨论】:
以上是关于在 Codeigniter 中捕获 Doctrine 异常的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章
未捕获的ReferenceError:$未定义 - Datepicker - Codeigniter 3
未捕获的 TypeError: $(...).select2 不是 CodeIgniter 中的函数
未捕获的 ReferenceError:$ 未定义 - Datepicker - Codeigniter 3
PHP - Codeigniter:未捕获的异常“PHPExcel_Reader_Exception”,消息“无法打开读取,文件不存在”