【发布时间】:2013-10-12 01:02:10
【问题描述】:
在 PHP MVC 应用程序中处理可能的 MySQL 错误的最常见/最佳实践是什么?最好将模型中的成功布尔值传递给控制器还是抛出异常? 假设我正在调用存储过程,我可能遇到的可能错误是数据库连接、用户没有权限、无效数据或随机 MySQL 错误,这可能是最有效/最有效的处理方法。
例如: 方法一:
//UserController.php
private function get_user_info(){
$user_info = $user_model->read_user_info(123);
if($user_info[0]){
//Do stuff with user data
}else{
//Check if db, permission, invalid data, or random MySQL error
}
}
//UserModel.php
public function read_user_info($read_user_id){
$stmt = $db->prepare("CALL read_user_info(?, ?)");
$stmt->bindParam(1, $current_user_id);
$stmt->bindParam(2, $read_user_id);
if($stmt->execute()){
$result_set = $stmt->fetchAll(PDO::FETCH_ASSOC);
//Does the user have permission to read other user's info
if($result_set["granted"]){
return array(true, $result_set["user_info"]);
}else{
return array(false, "Permission error");
}
}else{
return array(false, "MySQL error");
}
}
方法二:
//UserController.php
private function get_user_info(){
try{
$user_info = $user_model->read_user_info(123);
//Do stuff with user data
}catch(ConnectionException $e){
}catch(InvalidDataException $e){
}catch(MySQLException $e){
}
}
//UserModel.php
public function read_user_info($read_user_id){
$stmt = $db->prepare("CALL read_user_info(?, ?)");
$stmt->bindParam(1, $current_user_id);
$stmt->bindParam(2, $read_user_id);
if($stmt->execute()){
$result_set = $stmt->fetchAll(PDO::FETCH_ASSOC);
//Does the user have permission to read other user's info
if($result_set["granted"]){
return $result_set["user_info"];
}else{
throw new PermissionException();
}
}else{
throw new MySQLException();
}
}
【问题讨论】:
-
当与域对象交互时,数据完整性违规的异常应该是模型层内的数据映射器(或其他形式的抽象存储逻辑)中的句柄。数据完整性问题应该导致在对应的域对象中获取错误状态。服务中可能存在连接/凭据异常。当视图从模型层请求数据时(通过访问属于模型层的服务),它将被告知整个模型层的错误状态,并结合来自适当模板的响应。
-
我不确定我是否 100% 遵循前两句话,你能改写一下吗?我现在在想的是存储过程不需要担心数据完整性,因为它应该已经被模型内部的验证方法处理了。
-
This 可能会帮助您清除一些条款。使用“数据完整性检查”会引发异常,我的意思是
UNIQUE或FOREIGN密钥违规。在其他 RDBMS(如 postgre 和 oracle)中,您还可以在 "number must be between 10 and 99" 等列上添加额外的CONSTRAINTS。不要将其与属于域逻辑的验证规则混淆。检查您是否输入电子邮件的实例不应该知道甚至存在数据库。
标签: php mysql model-view-controller exception-handling