1

こんにちは私は一般的にCIとMVCに不慣れで、REStfulアプリケーションを作成しようとしています。

私は(本当に)たくさん読んだことがあり、次の仕様があります

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に関しては、次のURLがあります

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

私の質問は

RESTful用に1つ、CI CRUD用に1つ、2つのコントローラーが必要ですか。1つしか持てません。複数の表現(html、xml、json)を使用するにはどうすればよいですか。

適用されたヘルプ(読むためのリンクも)

ありがとう

4

1 に答える 1

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

注:とにかくこのコードをテストしていないので、作業が必要になります。

于 2012-07-30T10:50:11.847 に答える