从模型返回到控制器的正确方法

时间:2014-09-04 10:08:48

标签: php

我很抱歉提出这类问题,但我对这种情况感到非常沮丧

这是我的控制器

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();
    }
}

我的问题是,无论模型成功还是失败,总会返回一个字符串,因此在控制器中我无法确定名称是否已更改。如果我只返回truefalse然后在控制器中,如果某些内容失败,我将无法知道它是什么。我的另一个选择是返回模型中的数组,如array('error', 'message'),但这看起来很难看,让我觉得我做错了。你能用正确的方式指出我吗?

2 个答案:

答案 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使用异常版本。 没有“最好的方法”,只需使用一种方法并坚持使用它适用于所有模型。

(只是不要在失败的查询中返回解释错误的字符串!)