如何通过Slim php和Paris将骨干模型数据发布到DB

jmk*_*142 18 php json slim backbone.js idiorm

我试图了解Backbone.js,Slim 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
Run Code Online (Sandbox Code Playgroud)

我认为以上是我的主要问题.我的理解是,骨干将默认发送POST数据,因为它是新的.它将它发送到路由的/ donut,但我的问题是它发送了什么?以什么格式?我想要的结果是将这些甜甜圈属性保存到我的数据库中.我可以使用jQuery $ .post()将这个服务器端代码传递给json.

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

...并乐意接受它,将其保存到我的数据库中.但是当前设置尝试发送我的主干甜甜圈数据时,我收到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
});
Run Code Online (Sandbox Code Playgroud)

我有一种感觉答案就在那里,但我看过的每一个例子似乎都缺少了一块拼图或其他拼图,我无法得到那个"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);
    }
});
Run Code Online (Sandbox Code Playgroud)

现在当我运行backbone的save()时,我仍然得到500错误,但XMLHttpRequest也是我的FAIL响应.来自XMLHttpRequest的唯一显着线索是responseText = SQLSTATE [23000]:完整性约束违规:1048列'name'不能为null.

所以我的猜测是,1)我用save()弄乱了一些东西,因为它没有正确捕获我的属性,2)它当前正在以我的服务器无法识别的格式发送我的属性标准$ app-> request() - > post()Slim方法(当我尝试直接使用$ _POST访问时似乎没有做太多),3)我的服务器没有正确设置以获取那种数据正在发送.

我注意到的另一件事虽然我不知道该怎么做但是当我添加时

echo $_POST;
Run Code Online (Sandbox Code Playgroud)

它返回给我一个空数组.仍然给我失败.如果我这样做的话......

echo json_encode($_POST);
Run Code Online (Sandbox Code Playgroud)

它给了我一个成功,响应是[].那里什么都没有.显然我的POST数据仍然很糟糕.

jmk*_*142 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);
    }
});
************************************************************/
Run Code Online (Sandbox Code Playgroud)

Sever端: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
}
Run Code Online (Sandbox Code Playgroud)

现在我的代码很高兴使用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();
Run Code Online (Sandbox Code Playgroud)