web-dev-qa-db-ja.com

方法POSTスリムphpとパリを介してDBにバックボーンモデルデータ

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データは新しいので送信することを知っています。それはルーティングされる/ドーナツに送信しますが、私が持っている質問はそれが何を送信するのかということです。どの形式ですか?必要な結果は、これらのドーナツ属性をDBに保存することです。jQuery$ .post()..を使用して、このサーバー側コードをこのようなjsonに渡すことができます。

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

...そしてそれは喜んでそれを受け取り、私のデータベースに保存します。しかし、現在のセットアップでバックボーンドーナツデータを送信しようとすると、POST 500内部サーバーエラーが発生します。以下に、サーバー側のコードをいくつか示します。

サーバーサイド:スリム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);
    }
});

バックボーンのsave()を実行すると、500エラーが発生しますが、FAIL応答としてXMLHttpRequestも発生します。 XMLHttpRequestからの唯一の注目すべき手がかりはresponseText = SQLSTATE [23000]です:整合性制約違反:1048列 'name'をnullにすることはできません。

したがって、私の推測では、1)属性が正しくキャプチャされていないという点でsave()で何かを台無しにしている、2)現在、サーバーが認識していない形式で属性を送信している標準の$ app-> request()-> post()スリムメソッド($ _POSTを使用して直接アクセスしようとしても、あまり効果がないようです)、3)サーバーが正しくセットアップされていない種類のデータを取得する送信されています。

どうすればいいのかわからないのに気付いたもう一つのことは、

echo $_POST;

空の配列が返されます。それでも私は失敗します。しかし、これを行うと...

echo json_encode($_POST);

それは私に成功を与え、応答は[]です。そこには何もありません。明らかに私のPOSTデータはまだ不安定です。

18
jmk2142

私は問題を完了するための解決策を思いつきました:デフォルトのバックボーンsave()と.syncを使用してクライアントからサーバーにデータを取得する方法-Slim phpフレームワークに渡され、Paris/Idiormを経由してDBに渡されます。

私は以下に私の作業中の更新されたコードを含めています:

クライアント側: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);
    }
});
************************************************************/

サーバー側:スリム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のデフォルト設定(同期の変更なし)を問題なく使用し、データを正常に受け入れてDBに保存しているように見えるサーバーに適切なモデル属性情報を送信しています。

ここでの鍵はこの行のようです...

/* $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();
30
jmk2142

「サーバーに正確に何が送信されるか」を知りたい場合は、 BackboneのコードのBackbone.sync関数 を確認する必要があります。それは非常によく文書化されており、段階的に説明されています。次に、必要なことを実現するための最もクリーンな方法は、Backboneの同期に触発された独自の同期関数を作成することです。

また、サーバーに何が送信されているかをすばやく確認するには、ブラウザーのデバッグコンソール([ネットワーク]タブ)を使用します。ここで、Backboneによって送信されるものと、$。postを直接使用したときに送信されるものを比較できます。さらにヘルプが必要な場合は、この情報を投稿してください。

1
Blacksad

バックボーンはjsonデータをphpバックエンドサーバーに送信します。これは、get、post、put、deleteなどのhttp動詞に応答するようにRESTfulAPIを公開する必要があります。

バックエンドAPIは、データベースとの通信を担当します。

SLIMPHPについてはよくわかりません。リクエストを処理しているようです。エラーメッセージを貼り付けることはできますか?

0
dvliman