【问题标题】:OOP MVC - model or controller to check return data type?OOP MVC - 检查返回数据类型的模型或控制器?
【发布时间】:2011-06-10 02:46:54
【问题描述】:

有时我需要数组之类的数据,有时我需要与 json 相同的数据。

您会在哪里检查是否是 ajax 调用,在控制器或模型中,还是...哪个更好?

测试是否是控制器中的ajax调用

function my_controller(){
    //getdata from model
    $data=$this->my_model();
    if(THIS_IS_AJAX_CALL){
        echo json_encode($data);
    }else{
        return $data;
    }
}

function my_model(){
    //get the data from db
    return $data;
}

将类型作为参数传递给模型:

function my_controller(){
    if(THIS_IS_AJAX_CALL){
        return $this->my_model('json');
    }else{
        return $this->my_model();
    }
}

function my_model($type=''){
    //get the data from db
    if($type='json'){
        return json_encode($data);
    }else{
        return $data;
    }
}

【问题讨论】:

    标签: php ajax oop json model-view-controller


    【解决方案1】:

    控制器。模型不关心数据需要如何呈现给用户,只关心数据本身。

    【讨论】:

      【解决方案2】:

      引用Codeigniter tutorial explaining MVC:

      • 模型代表您的数据结构。通常,您的模型类将包含帮助您在数据库中检索、插入和更新信息的函数。

      • 视图是呈现给用户的信息。视图通常是网页,但在 CodeIgniter 中,视图也可以是页眉或页脚等页面片段。它也可以是 RSS 页面,或任何其他类型的“页面”。

      • 控制器充当模型、视图以及处理 HTTP 请求和生成网页所需的任何其他资源之间的中介。

      我认为您应该检查控制器(这与数据结构无关)标头以查看它是否是 ajax 调用,因为jquery sets headers。如果是 Ajax 调用,您应该执行所需的 json_encode 转换。我认为您的代码应该类似于以下代码:

      function is_xhr() {
        return @ $_SERVER[ 'HTTP_X_REQUESTED_WITH' ] === 'XMLHttpRequest';
      }
      
      $data = /* get from model */
      if( is_xhr() ){
        // Not explicitly needed, but we like being accurate, right?:
        header('Content-type: application/json');
      
        echo json_encode($data);
        exit(); // We don't need to render anything else
      } else {
        echo $data;
      }
      

      【讨论】:

      • CodeIgniter 描述的是 Passive-MVC(模型不知道它在三元组中的使用,只是一个浅层数据库接口)。
      • @mario:那么,你对我的问题有什么建议?
      • @mojeime:嗯,我认为你的问题是一个红鲱鱼。它不应该在虚假的 MVC 三元组中处理,而应该在引导代码中处理。 UI 输出和 API 响应应该返回相同内容的情况太少。
      猜你喜欢
      • 1970-01-01
      • 2014-05-20
      • 1970-01-01
      • 2013-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多