
CodeIgniter 來當作 REST Server 的朋友們,我相信都會找到 philsturgeon 所寫的 codeigniter-restserver,此套件幫你完成底層 API Response 動作,讓你可以輕易處理 REST URL。但是如果拿這套程式碼來搭配 Backbone.js 你會遇到拿不到 POST 或 PUT 變數問題,作者來一一描述。
使用 Backbone.js 來取代 jQuery AJAX 方式來跟 REST Server 溝通,當然 Backbone.js 底層還是透過 jQuery AJAX API 來傳遞,首先我們建立一個簡易的 Backbone model
// a simple backbone model
var User = Backbone.Model.extend({
    urlRoot: '/user',
    defaults:{
        'name':'appleboy',
        'age': 31
    }
});
var user1 = new User();
var user2 = new User();
var user3 = new User();
你可以建立多個使用者,或是搭配 Backbone Collection 來顯示,到這邊是沒有問題,接著要跟伺服器做 GET PUT POST DELETE 的動作,也就是透過底下 Backbone 操作user1.fetch() // get user data user1.save() // create or update user user1.destroy() // delete user這邊就會是問題所在,你會發現 backbone 丟給 REST request 的內容不會是像 jQuery AJAX 包在 parameter 內,而是在
Request Payload 內寫入 {’name’:‘appleboy’, ‘age’: 31},所以我們在 REST Server 會一直存取不到任何資料
class User extends REST_Controller
{
    public function index_get()
    {
        echo $this->get(null);
    }
    public function index_post()
    {
        echo $this->post(null);
    }
    public function index_put()
    {
        echo $this->put(null);
    }
    public function index_delete($id)
    {
        echo $this->put(null);
    }
}問題出在 REST_Controller.php 處理 POST 函數/**
 * Parse POST
 */
protected function _parse_post()
{
    $this->_post_args = $_POST;
    $this->request->format and $this->request->body = file_get_contents('php://input');
}只要將上面函數改成/**
* Parse POST
*/
protected function _parse_post()
{
    $this->_post_args = $_POST;
    $this->request->format and $this->request->body = file_get_contents('php://input');
    if (!empty($this->request->body)) {
        $this->_post_args = array_merge($_POST, json_decode($this->request->body, true));
    }
}這樣 POST 就沒有問題了,接著如果 PUT 或 DELETE 也遇到此問題,就按照上述改相關函式。晚點發 pull request 給作者,只是不知道作者會啥時處理。See also
- CodeIgniter 3.0 Release 終於釋出啦
 - CodeIgniter 搭配 Homestead 開發環境
 - CodeIgniter 終於找到新東家 British Columbia Institute of Technology 英屬哥倫比亞理工學院
 - 實戰 CodeIgniter in 成功大學計算機與網路中心
 - 升級 PHP Facebook SDK 到 4.0.x 版本
 - Backbone.js 1.1.1 Release 釋出 AMD 版本
 - CodeIgniter 初始化 Library 流程
 - Javscript 18 歲生日歷史演進
 - 將 Backbone Framework 升級到 1.1.0 注意事項
 - HAProxy 搭配 CodeIgniter 取使用者真實 IP