2012-07-30 74 views
1

嗨,我是新來的CI和MVC一般,我想做一個REStful應用程序。CodeIgniter REST風格和控制器

我已經讀了很多(真的),我有以下規格

的RESTful

讀取(GET)

/object 
/object.xml 
/object.json 

讀取ID(GET)

/object/id 
/object/id.xml 
/object/id.json 

創建(POST)

/object 
/object.xml 
/object.json 

更新(PUT)

/object/id 
/object/id.xml 
/object/id.json 

刪除(DELETE)

/object/id 
/object/id.xml 
/object/id.json 

基於以上時擴展的.xml返回XML,當上傳.json返回JSON和分機返回html

當談到CI CRUD我有followig url

/object 
/object/edit/id 
/odject/delete/id 

我的問題是

我需要爲REST風格的2個控制器1和1 CI CRUD或我只能有1個, ,我怎麼可以有多個respesentation(HTML,XML,JSON)。

appricated(鏈接閱讀時間)

感謝

回答

3

任何幫助看一看:http://net.tutsplus.com/tutorials/php/working-with-restful-services-in-codeigniter-2/

你也可以做到這一點不同的方式,但是我覺得上面的可能是最好的開始的地方。

更新

另一種方式,可以使用航線。

$routes['object\.(xml|http|json)'] = 'process_object/$1'; 
$routes['object/(:num)\.(xml|http|json)'] = 'process_object/$2/$1'; 
$routes['object/crud/\.(xml|http|json)'] = 'process_object/$1/null/true'; 
$routes['object/crud/(:num)\.(xml|http|json)'] = 'process_object/$2/$1/true'; 

那麼你process_object行動:

function process_object($Format = 'xml', $ID = null, $CRUD = false) 
{ 
    $method = $this->_detect_method(); // see http://stackoverflow.com/questions/5540781/get-a-put-request-with-codeigniter 
    $view = null; 
    $data = array(); 
    switch($method) 
    { 
     case 'get' : 
     { 
      if($CRUD !== false) 
       $view = 'CRUD/Get'; 
      if($ID === null) 
      { 
       // get a list 
       $data['Objects'] = $this->my_model->Get(); 
      } 
      else 
      { 
       $data['Objects'] = $this->my_model->GetById($ID); 
      } 
     } 
     break; 
     case 'put' : 
     { 
      if($CRUD !== false) 
       $view = 'CRUD/Put'; 
      $this->my_model->Update($ID, $_POST); 
     } 
     break; 
     case 'post' : 
     { 
      if($CRUD !== false) 
       $view = 'CRUD/Post'; 
      $this->my_model->Insert($_POST); 
     } 
     break; 
     case 'delete' : 
     { 
      if($CRUD !== false) 
       $view = 'CRUD/Delete'; 
      $this->my_model->Delete($ID); 
     } 
     break; 
    } 
    if($view != null) 
    { 
     $this->load->view($view, $data); 
    } 
    else 
    { 
     switch(strtolower($Format)) 
     { 
      case 'xml' : 
      { 
       // create and output XML based on $data. 
       header('content-type: application/xml'); 
      } 
      break; 
      case 'json' : 
      { 
       // create and output JSON based on $data. 
       header('content-type: application/json'); 
       echo json_encode($data); 
      } 
      break; 
      case 'xml' : 
      { 
       // create and output HTML based on $data. 
       header('content-type: text/html'); 
      } 
      break; 
     } 
    } 
} 

注:我沒有反正測試此代碼,所以它需要的工作。

+0

謝謝我已經看過這個,但這個有一個restfull控制器擴展,而不是CI。所以它不清楚我是否必須有2個控制器,因爲2個控制器是雙重工作。謝謝無論如何 – ntan 2012-07-30 10:52:57

+0

你可能「可能」擁有一個控制器,但是這樣做可能會使事情複雜化。我正在看的另一種方式是使用路線。看到我更新的答案。 – Gavin 2012-07-30 11:02:17

+0

你有一點我會檢查出來 – ntan 2012-07-30 11:19:22