【问题标题】:Best way to catch Doctrine Exceptions in Codeigniter在 Codeigniter 中捕获 Doctrine 异常的最佳方法
【发布时间】:2011-07-18 13:34:42
【问题描述】:

您认为在 codeigniter 框架中捕获所有学说 1.2 ORM 异常的最佳方法是什么,我不想用 try catch 包装整个 index.php,但也不想在每个查询之前和之后进行 try catch ,

【问题讨论】:

  • 如果不是这两个,您会想到哪些其他选项?你已经尝试过这些吗? index.php 有什么不好?

标签: php codeigniter orm doctrine doctrine-1.2


【解决方案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 加载它。

对于像 updatedelete 这样的记录方法 - 您必须将其包装在 try .. catch 中。

好吧,如果您没有将与数据库相关的逻辑集中在模型中...实际上这不会改变任何事情,但这意味着您的应用程序设计不佳,违反了MVC 模式的基本原则,所以开始重构吧。

最后可能的解决方案 - 是侵入 Doctrine 核心类(特别是进入 Doctrine_Connection)并包装到执行实际查询的 try ... catch 行中。但这是个坏主意,我真的不会那样做。

一点更新:由于所有 Doctrine 实体对象都是 Doctine_Record 的子类,您可以使用包装 savedelete 等的方法扩展 SafeQueryHelper

public static function SafeSave(Doctrine_Record $entity){
    try{
        $entity->save();
    }
    catch(Exception $e){
        //catch it
    }
}

而不是将$entity->save()替换为SafeQueryHelper::SafeSave($entity)

【讨论】:

    猜你喜欢
    • 2012-10-10
    • 2010-09-10
    • 2012-02-12
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 2013-08-12
    相关资源
    最近更新 更多