2012-01-29 14 views
18

我試圖理解Backbone.js,Slim PHPParis/Idiorm可能如何協同工作,並且我無法完成流程,從模型屬性數據開始,一直到數據庫。問題:當我使用model.save()時,究竟發送給我的服務器的是什麼?如何通過Slim php和Paris將骨幹模型數據發佈到數據庫

客戶端:Backbone.js的

var Donut = Backbone.Model.extend({ 
    defaults: { 
     name: null, 
     sparkles: false, 
     creamFilled: false 
    }, 
    url: function() { 
     return '/donut'; 
    } 
}); 

var bostonCream = new Donut({ 
    name: 'Bawston Cream', 
    sparkles: true, 
    creamFilled: true 
}); 

bostonCreme.save(); // <-- Problem: Not sure what & format this is sending 

我覺得上面的是我的主要問題。我的理解是骨幹將默認情況下知道發送POST數據,因爲它是新的。它將它發送給路由的/ donut,但是我的問題是它發送了什麼?並以什麼格式?我想要的結果是將這些甜甜圈屬性保存到我的數據庫中。我可以通過這個服務器端代碼一個JSON像這樣使用jQuery $。員額()...

var myDonut = {"name":"Jelly Filled", "sparkles":false, "creamFilled":true}; 
$.post('http://localhost/donut', myDonut); 

...它高興地需要它,它保存到我的數據庫。但目前的設置嘗試發送我的主幹圓環數據,我得到POST 500內部服務器錯誤。下面我有一些服務器端代碼。

服務器端:修身PHP瓦特/巴黎

class Donut extends Model {} 

$app->post('/donut', function() use ($app) { // Slim framework routes my POST... 

    $donuts = Model::factory('Donut')->create(); // Paris stuff... 

    $donuts->name = $app->request()->post('name'); // Slim request parameters... 
    $donuts->sparkles = $app->request()->post('sparkles'); 
    $donuts->creamFilled = $app->request()->post('creamFilled'); 

    $donuts->save(); // Paris... Save name, sparkles, and creamFilled to my DB 
}); 

我有一種感覺,答案就在那裏,但每次我已經看了例子似乎缺少一塊拼圖或其他與我無法得到那個「A-hA!」時刻。如果這是一個非常無知的問題,我事先感謝你並道歉。 :-P

隨訪/編輯:1

可以粘貼的錯誤信息?

我在當前狀態下得到一個POST http://localhost:8888/donut 500(內部服務器錯誤)。我可以通過以下代碼獲取更多信息。

bostonCream.save({}, { // REPLACE bostonCream.save(); 
    success: function(model, response) { 
     console.log('SUCCESS:'); 
     console.log(response); 
    }, 
    error: function(model, response) { 
     console.log('FAIL:'); 
     console.log(response); 
    } 
}); 

現在,當我運行骨幹的save(),我仍然得到500錯誤,而且作爲的XMLHttpRequest我的失敗響應。 XMLHttpRequest唯一值得注意的線索是responseText = SQLSTATE [23000]:完整性約束違規:1048'name'列不能爲空。

所以我的猜測是要麼1)我把save()的東西搞亂了,因爲它沒有正確捕獲我的屬性,2)它當前發送我的屬性的格式是我的服務器不是' t用標準的$ app-> request() - > post()Slim方法來識別(當我嘗試直接用$ _POST進行訪問時,似乎沒有太多的工作),3)我的服務器沒有正確設置,正在發送的數據種類。

另一件事我注意到,雖然我不知道做的是什麼,當我添加

echo $_POST; 

它返回給我一個空數組。仍然給我失敗。但是,如果我這樣做...

echo json_encode($_POST); 

它給了我一個成功和答覆是[]。那裏沒有東西。很明顯,我的POST數據仍然不可靠。

回答

30

我想出了一個解決方案來完成這個問題:如何使用默認主幹節點save()和.sync從客戶端到服務器獲取數據 - 傳遞給Slim php框架並通過Paris/Idiorm傳遞給我的數據庫。

我包括我的工作更新如下代碼:

客戶端:Backbone.js的

var Donut = Backbone.Model.extend({ 
    defaults: { 
     name: null, 
     sparkles: false, 
     creamFilled: false 
    }, 
    url: function() { 
     return '/donut'; 
    } 
}); 

var bostonCream = new Donut({ 
    name: 'Bawston Cream', 
    sparkles: true, 
    creamFilled: true 
}); 

bostonCream.save(); 

/***** If you want to check out the response to save() ? *** 
bostonCream.save({}, { 
    success: function(model, response) { 
     console.log('SUCCESS:'); 
     console.log(response); 
    }, 
    error: function(model, response) { 
     console.log('FAIL:'); 
     console.log(response); 
    } 
}); 
************************************************************/ 

Sever的邊:超薄PHP W /巴黎/ Idorm

class Donut extends Model {} 

$app->post('/donut', function() use ($app) { 

    $donuts = Model::factory('Donut')->create(); 

    /* EDIT: Works... but not the Slim way 
    $parameters = json_decode(file_get_contents('php://input'), true); 
    $donuts->name = $parameters['name']; 
    $donuts->sparkles = $parameters['sparkles']; 
    $donuts->creamFilled = $parameters['creamFilled']; */ 

    /* SLIM: Using Slim Request Object */ 
    $requestBody = $app->request()->getBody(); // <- getBody() of http request 
    $json_a = json_decode($requestBody, true); 
    $donuts->name = $json_a['name']; 
    $donuts->sparkles = $json_a['sparkles']; 
    $donuts->creamFilled = $json_a['creamFilled']; 

    $donuts->save(); 

    // echo json_encode($parameters); // Prove you've captured POST data, send it back 
} 

現在我的代碼很高興地使用Backbone.js的默認設置(不更改同步)併發送適當的m odel屬性信息到我的服務器似乎正在成功接受數據並將其保存到我的數據庫。

這裏的關鍵似乎是這條線......

/* $parameters = json_decode(file_get_contents('php://input'), true); */ 
// EDITED: getBody() method not documented in Develop Doc, only Stable @ time of post 

$requestBody = $app->request()->getBody(); 
+0

你是個好人!對於這個問題+答案是一個加號。謝謝! – 2012-08-19 04:20:21

+0

嗨orangewarp,我一直在使用Backbone和Slim在同一個問題上掙扎。我覺得很奇怪,儘管你必須使用getBody(),但根據你的請求使用post()或put()更合適。 – Maarten 2012-11-23 12:29:47

+0

您可以讓Slim爲您解析JSON。你仍然需要調用getBody()。請求的post()方法不支持ContentType中間件所做的解析,並且似乎只處理表單數據。實例化$ app後,執行以下操作:$ app-> add(new \ Slim \ Middleware \ ContentTypes()); //獲取傳入的JSON解析。之後,getBody()返回一個很好的解析數據數組。 – 2012-12-12 20:07:02

1

如果你想知道「什麼發送到服務器」,你應該看看Backbone.sync function in Backbone's code。這是非常有據可查的,一步一步的。然後,最簡潔的方式來實現你需要的是寫你自己的同步功能,受Backbone的同步啓發。

另外,查看發送到服務器的快速方法是使用瀏覽器調試控制檯(網絡選項卡)。您可以在此比較Backbone發送的內容與直接使用$ .post時發送的內容。如果您需要更多幫助,請發佈此信息!

+0

我會重讀Backbone.sync文檔。我的理解到目前爲止,它已經有一個默認的行爲,我想明白! :-)據我所知,它需要我的模型屬性並將它們序列化成JSON,併發送它,並且如果我對該對象進行更改,它期望從服務器返回一個JSON。使用我發佈的示例,當我做... bostonCream.save(); 我預計像... { 「名」: 「Bawston霜」, 「火花」:真實的, 「creamFilled」:真正} 發送。如果這是真的,它應該與我的上述代碼一起工作,但事實並非如此。疑似! – jmk2142 2012-01-29 23:18:43

+0

另外,關於使用控制檯。使用jQuery的$ .post,我可以使用console.log(data)成功或失敗的回調函數。我可以回顯$ _POST並查看是否捕獲或不捕獲。但與Backbone,我不知道如何看到我的echo $ _POST。 bostonCream.save()將發送請求並返回...什麼?像這樣的東西是檢查什麼被返回的正確方法嗎? bostonCream.save({},{success:function(model,response){console.log('SUCCESS'); console.log(response);},error {console.log('FAIL'); console.log response);}}); – jmk2142 2012-01-29 23:35:48

+0

對不起,我的意思是「閱讀骨幹源代碼」(我發佈了一個鏈接到文檔,我的錯)。在backbone.sync中,你會看到會發生什麼。 – Blacksad 2012-01-30 16:39:26

0

骨幹發送JSON數據到PHP後端服務器,你應該暴露你的RESTful API來響應HTTP動作像GET,POST,放,刪除等

後端API是負責與數據庫通信。

我不確定SLIM PHP。它似乎處理了這個請求。你能粘貼錯誤信息嗎?

+0

我在測試後用更多的錯誤消息更新了上面的代碼。我會像@Blacksad所建議的那樣做更多的閱讀。 – jmk2142 2012-01-30 00:01:31

相關問題