我很抱歉提出这类问题,但我对这种情况感到非常沮丧
这是我的控制器
public function changeName_PUT() {
header('Content-Type: application/json');
$return = \Models\User::getCurrent()->changeName(Input::data());
return json_encode($return);
}
这是我的模特
public function changeName($data){
$rules = array( ... );
$messages = array( ... );
$valid = Input::validate($data, $rules, $messages);
if($valid === true){
return $this->putIntoDb(array('name' => $data['name'])) ? 'Namechanged successfully.' : 'An error occurred.';
}else{
return $valid->getMessage();
}
}
我的问题是,无论模型成功还是失败,总会返回一个字符串,因此在控制器中我无法确定名称是否已更改。如果我只返回true
或false
然后在控制器中,如果某些内容失败,我将无法知道它是什么。我的另一个选择是返回模型中的数组,如array('error', 'message')
,但这看起来很难看,让我觉得我做错了。你能用正确的方式指出我吗?
答案 0 :(得分:1)
模型层根本不应该向控制器发送数据。
在MVC架构模式中,控制器负责改变模型层的状态。就是这样。然后,查看实例从所述模型层中提取所需的信息。
如果由于控制器的更改,在模型层中触发错误状态,则控制器不关心它。对于视图而言,这一点非常重要,根据是否发生错误,视图可能会选择一组不同的模板来组合响应。
P.S。: HTTP标头是响应的一部分。那么,为什么你的"控制器"产生回应?它与在那里放置 echo 基本没什么不同。
答案 1 :(得分:1)
您有不同的方法:
简单版本:如果插入,则返回inserted_id | false。如果删除,则返回true | false。如果更新,则返回true | false。如果选择,则返回array | string | false。
类版本:返回true或false(select返回查询字符串数组除外)。并且您在类变量中存储错误消息,以便您可以执行以下操作:
$success = $model->query('blabla');
if (!$success)
print_r($model->getMessages());
对象版本:与简单版本相同,只是在成功选择或更新查询时返回数据库对象(否则为false)。
异常版本:与对象版本相同,但不会返回false,而是抛出描述问题的错误。
现在,如果查看常见框架,您将看到CodeIgniter使用对象版本,Phalcon使用类版本,Zend使用异常版本。 没有“最好的方法”,只需使用一种方法并坚持使用它适用于所有模型。
(只是不要在失败的查询中返回解释错误的字符串!)