在Codeigniter中捕获Doctrine Exceptions的最佳方法

时间:2011-07-18 13:34:42

标签: php codeigniter orm doctrine doctrine-1.2

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

1 个答案:

答案 0 :(得分: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的子类,您可以使用SafeQueryHelpersave等方法扩展delete

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

$entity->save()替换为SafeQueryHelper::SafeSave($entity)