我正在努力了解Backbone.js,Slim PHP和Paris/Idiorm如何协同工作,我在完成流程时遇到了问题,从模型属性数据开始,所有通往数据库的方式。问题:当我做model.save()时,究竟是什么发送到我的服务器?
客户端: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,但我的问题是它发送了什么?以什么格式?我想要的结果是将这些甜甜圈属性保存到我的数据库中。我可以使用jQuery $ .post()...
将这个服务器端代码传递给像这样的jsonvar myDonut = {"name":"Jelly Filled", "sparkles":false, "creamFilled":true};
$.post('http://localhost/donut', myDonut);
...它很乐意接受它,将它保存到我的数据库中。但是当前设置尝试发送我的主干甜甜圈数据时,我收到POST 500内部服务器错误。下面我有一些服务器端代码。
服务器端:Slim PHP w / Paris
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);
}
});
现在当我运行backbone的save()时,我仍然得到500错误,但仍然是XMLHttpRequest作为我的FAIL响应。来自XMLHttpRequest的唯一显着线索是responseText = SQLSTATE [23000]:完整性约束违规:1048列'name'不能为空。
所以我的猜测是1)我用save()弄乱了一些东西,因为它没有正确捕获我的属性,2)它当前以我的服务器不是格式发送我的属性使用标准$ app-&gt; request() - &gt; post()识别Slim方法(当我尝试直接使用$ _POST访问时似乎没有做太多),3)我的服务器设置不正确正在发送的数据类型。
我注意到的另一件事虽然我不知道该怎么做但是当我添加
时echo $_POST;
它返回给我一个空数组。仍然给我失败。如果我这样做的话......
echo json_encode($_POST);
它给了我一个成功,响应是[]。那里什么都没有。显然我的POST数据仍然很糟糕。
答案 0 :(得分: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-side:Slim PHP w / Paris / 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的默认设置(无需更改同步)并将正确的模型属性信息发送到我的服务器,该服务器似乎已成功接受数据并将其保存到我的数据库。
这里的关键似乎是这一行......
/* $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();
答案 1 :(得分:1)
如果您想知道“究竟是什么发送到服务器”,您应该看一下Backbone.sync function in Backbone's code。这是一个非常详细的文档,一步一步。然后,实现您所需要的最简洁方法是编写自己的同步功能,灵感来自Backbone的同步。
此外,快速查看发送到服务器的内容的方法是使用浏览器调试控制台(“网络”选项卡)。您可以在此比较Backbone发送的内容与直接使用$ .post时发送的内容。如果您需要更多帮助,请发布此信息!
答案 2 :(得分:0)
backbone将json数据发送到你的php后端服务器,你应该公开你的RESTful api以响应http动词,如get,post,put,delete等。
你的后端api负责与数据库通信。
我不确定SLIM PHP。它似乎处理请求。你能粘贴错误信息吗?