IT序号网

php之我应该如何处理我的 Codeigniter 模型中的错误

third_qq_acbf90bbd2dede1d 2024年06月20日 编程语言 172 0

我开始在我的 codeigniter 模型中进行验证/清理,在深入研究之前,我正在寻找一些关于最佳实践的建议。 Controller 的 form validation 库很棒,但显然我不想依赖 Controller 向我发送好的数据。

目前我返回 bool 值,成功时返回 TRUE(或数据),失败时返回 FALSE,这使得将错误消息传递回调用者变得非常困难。我想在失败时摆脱 FALSE。

虽然我绝对不是专家,但我已经开始阅读很多关于异常的文章,并且在外部库中遇到过很多,它们似乎是一个很好的候选者。我的问题是,这是对异常的适当使用吗?模型错误是异常错误吗?

一个可能的例子:

<?php 
class person_model extends CI_Model{ 
 
    public function getPersonById($personId){ 
 
        //check for int 
        if(!is_int($personId) OR $personId < 0){ 
            throw new Exception('Invalid person ID'); 
        } 
 
        //setup query 
        $this->db->select('*') 
            ->where('personId', $personId); 
 
        //run query 
        $result = $this->db->get('person'); 
 
        //failed to get 
        if(!$result){ 
            throw new Exception('DB query failed'); 
            //should i also return false? 
            return FALSE; 
        } 
 
        //got info 
        else{ 
            return $result; 
        } 
    } 
} 
?> 

感谢您的帮助!

编辑:

我不得不说我对建议数据验证应该只在 Controller 中完成的响应感到非常惊讶。模型是数据存储的最后一道障碍。模型是数据和应用于该数据的规则,即您的应用程序逻辑。数据验证对我来说似乎是应用程序逻辑。此外,您可能有许多 Controller 访问相同的模型方法。你想依赖两个 Controller 实现相同的验证吗?这对我来说似乎很愚蠢。

此外,并非所有数据都来自用户输入,其中一些数据可能会由编写 Controller 的程序员硬编码到脚本中。如果他们在您的模型需要整数时传递字符串怎么办?或者传递格式错误的日期?模型不应该说些什么吗。

我愿意讨论,但我觉得数据验证绝对属于模型。 (除了controller,还有view(为了方便html5/javascript))

请您参考如下方法:

我发现处理此问题的最简单方法是始终首先使用 if 检查来检查否定条件。这也使得检查多个步骤变得容易。

只要有可能,总是从你的模型方法中返回一些东西。甚至在这个例子中——我们需要验证表单——我会使用 codeigniters 表单验证来验证它是一个整数等。如果它通过验证,那么我们需要 $personId 来进行数据库搜索。因此,不仅仅是从验证中返回 true/false - 如果验证通过则返回 $personId :

function getperson() { 
 // Validate the form  
 // AND if its valid, return the validated $personId  
 // Note the separate private method if the validation failed  
 if ( ! $personId = $this->person->_validateGetPersonForm() ) { 
     $this->error_msg = 'Error in validating the form. Please use a number.'; 
 $this->_showGetPersonFailed() ; } 
 
 elseif ( ! $person = $this->person->getBy($personId)  ) { 
$this->error_msg = 'There is no person in our records with the number:'. $personId; 
$this->_showGetPersonFailed() ; } 
 
 else {  $this->_showResultsFor($person) ; }  
  }  

$this->error_msg 可自动用于您的任何 View ,因为我们已经打破了验证和数据库搜索 - 错误消息很容易适合确切的条件。如果搜索失败,则有一个私有(private)方法 _showGetPersonFailed() 可以再次显示表单。最后一个 if/else 通常是成功的——有一个单独的私有(private)方法来处理用适当的 View 显示结果。

还建议不要像“person_model”那样在文件名中使用“model”一词。它只会打乱整个命名并迫使你一遍又一遍地输入模型这个词 :-) 这样想:如果你从 Controller 调用一些东西并取回结果——它几乎总是一个模型。并且您所有的模型文件将始终位于名为 models 的文件夹中。


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!