我开始在我的 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 的文件夹中。