18

我试图了解Backbone.jsSlim PHPParis/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() 将这个服务器端代码传递给这样的 json ...

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

...它很乐意接受它,将其保存到我的数据库中。但是在当前设置尝试发送我的主干甜甜圈数据时,我收到 POST 500 Internal Server Error。下面我有一些服务器端代码。

服务器端: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
});

我觉得答案就在那里,但我看过的每个例子似乎都缺少一块或另一块拼图,我无法得到“啊哈!” 片刻。如果这是一个非常无知的问题,我提前感谢您并道歉。:-P

跟进/编辑:1

你能粘贴错误信息吗?

我在当前状态下收到 POST http://localhost:8888/donut 500 (Internal Server Error)。我可以使用以下代码获取更多信息。

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 作为我的 FAIL 响应。来自 XMLHttpRequest 的唯一显着线索是 responseText = SQLSTATE[23000]:完整性约束违规:1048 列“名称”不能为空。

所以我的猜测是,要么 1)我在 save() 上搞砸了,因为它没有正确捕获我的属性,2)它目前正在以我的服务器无法识别的格式发送我的属性标准 $app->request()->post() Slim 方法(当我尝试直接使用 $_POST 访问时似乎也没有多大作用),3)我的服务器没有正确设置以获取那种数据正在发送。

尽管我不知道该怎么做,但我注意到的另一件事是,当我添加

echo $_POST;

它返回给我一个空数组。仍然给我失败。但是,如果我这样做...

echo json_encode($_POST);

它给了我一个成功,响应是 []。里面什么都没有。显然我的 POST 数据仍然不稳定。

4

3 回答 3

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);
    }
});
************************************************************/

服务器端: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();
于 2012-01-30T02:04:10.510 回答
1

如果你想知道“究竟是什么发送到服务器”,你应该看看Backbone 的代码中的 Backbone.sync 函数。这是非常有据可查的,一步一步的。然后,实现你需要的最简洁的方法是编写你自己的同步函数,灵感来自 Backbone 的同步。

此外,查看发送到服务器的内容的一种快速方法是使用浏览器调试控制台(网络选项卡)。您可以在此处比较 Backbone 发送的内容与直接使用 $.post 时发送的内容。如果您需要更多帮助,请发布此信息!

于 2012-01-29T15:55:45.327 回答
0

主干将 json 数据发送到您的 php 后端服务器,您应该公开您的 RESTful api 以响应 http 动词,如 get、post、put、delete 等。

您的后端 api 负责与数据库通信。

我不确定 SLIM PHP。它似乎可以处理请求。你能粘贴错误信息吗?

于 2012-01-29T18:23:28.717 回答