2012-01-29 10 views
18

Backbone.js,とParis/Idiormがどのように機能するかを理解しようとしていますが、モデル属性データから始めて、データベースに至るまで問題:model.save()を実行すると、正確に何が私のサーバーに送られるのですか?Slim phpとParisを使用してバックボーンモデルデータをDBにPOSTする方法

クライアント側: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に保存することです。私は...)(このサーバー側のコードに

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

を、この使用してjQueryの$ .postのようなJSONを渡すことができます...そして、それは喜んで私のそれをデータベースに保存し、それを取ります。しかし、現在の設定でバックボーンのドーナツデータを送信しようとすると、POST 500 Internal Server Errorが発生します。私はいくつかのサーバー側のコードがあります。

サーバー側:私は答えを感じている/パリワットスリム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 
}); 

はそこにあるが、私は見てきたすべての例では、1つのパズルのピースまたは他の欠落しているようだと、私はそれを得ることができません "ああ!瞬間これが本当に無知な質問であれば、事前に感謝し、謝罪します。/EDIT :-P

フォロー:1

あなたはエラーメッセージを貼り付けることはできますか?

現在の状態でPOST http://localhost:8888/donut 500(内部サーバーエラー)が表示されます。私は次のコードでより多くの情報を得ることができます。私は背骨のsave()を実行したときに

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

今、私はまだ私のFAIL応答として500エラーだけでなく、XMLHttpRequestのを取得します。 XMLHttpRequestの唯一の顕著なヒントはresponseText = SQLSTATE [23000]です。整合性制約違反:1048 'name'列をnullにすることはできません。

私の推測では、1)私の属性を正しくキャプチャしていないという点で、save()を使って何かをしゃがんでいる、2)現在私のサーバがisn '標準の$ app-> request() - > post()で認識してください。スリムな方法($ _POSTで直接アクセスしようとするとあまり効果がないようです)、3)サーバーが正しく設定されていない送信されるデータの種類。私はそれを作るために何を知っていませんが、私は気づいた

もう一つは、私が

echo $_POST; 

を追加したときにそれは私には空の配列を返すことです。まだ私にFAILを与えます。しかし、私はこれをすれば...

echo json_encode($_POST); 

それは私にSUCCESSを与え、応答は[]です。そこには何もありません。明らかに、私のPOSTデータは依然として不安定です。

答えて

30

デフォルトのバックボーンsave()と.syncを使用してクライアントからサーバーにデータを取得する方法 - Slim PHPフレームワークに渡され、Paris/Idiormを介してDBに渡される。

I以下の私の働いて更新されたコードを含む午前:

クライアント側: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 /パリ/ 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属性情報をサーバーに送信して、データを正常に受け入れてDBに保存しているようです。ここ

キーは、私はBackbone.syncのドキュメントを読み直します

/* $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

あなたは元気です!それは質問+答えのためのプラスです。ありがとう! –

+0

こんにちは、私はBackboneとSlimを使って同じ問題に苦労しています。あなたのリクエストに応じてpost()やput()を使う方が適切なのに対し、getBody()を使う必要がありますが、非常に奇妙です。 – Maarten

+0

SlimでJSONを解析することができます。それでもgetBody()を呼び出す必要があります。リクエストのpost()メソッドは、ContentTypeミドルウェアが行った構文解析を尊重せず、フォームデータのみを扱うように見えます。 $ appをインスタンス化したら、次のようにします:$ app-> add(new \ Slim \ Middleware \ ContentTypes()); //受信したJSONを解析します。その後、getBody()は解析されたデータの素敵な配列を返します。 –

1

「正確に何がサーバーに送信されたか」を知りたい場合は、Backbone.sync function in Backbone's codeをご覧ください。それは非常によく文書化されています。次に、必要なものを達成する最もクリーンな方法は、Backboneの同期に触発された独自の同期機能を書き込むことです。

また、サーバーに送信される内容を確認するには、ブラウザのデバッグコンソール([ネットワーク]タブ)を使用する方法があります。バックボーンから送信されたものと、$ .postを直接使用したときに送信されたものとを比較することができます。さらに詳しい情報が必要な場合は、この情報を投稿してください!

+0

...この行のようです。これまでのところ私の理解は、それがすでにデフォルトの振る舞いを持っていることであり、私は理解したい!私が理解しているところでは、モデルの属性がJSONにシリアル化されて送信され、オブジェクトに変更を加えるとJSONがサーバーから返されることを期待しています。私が投稿した例を使用して、私がしたとき... bostonCream.save(); {"name": "Bawston Creme"、 "sparkles":true、 "creamFilled":true} を送信します。これが本当であれば、私の上記のコードではうまくいくはずですが、そうではありません。容疑者! – jmk2142

+0

また、コンソールの使用に関しても。 jQueryの$ .postには、console.log(データ)に使用できる成功または失敗のコールバックがあります。 $ _POSTをエコーし​​て、キャプチャされているかどうかを確認できます。しかし、Backboneではecho $ _POSTの表示方法がわかりません。 bostonCream.save()は要求を送信し、何かを返すでしょうか?このようなものが返されているものをチェックする正しい方法でしょうか? bostonCream.save({}} {console.log( 'SUCCESS'); console.log(response);}、エラー{console.log( 'FAIL');レスポンス);}})); – jmk2142

+0

申し訳ありませんが、「バックボーンソースコードを読んでください」という意味でした(ドキュメントへのリンクを掲載しました。私の誤りです)。 backbone.syncでは、何が起こるかがわかります。 – Blacksad

0

バックボーンは、バックエンドAPIは、データベースと通信するための責任がある

あなたが、得るようなHTTP動詞に対応ポスト、置く、削除するために、あなたのRESTfulなAPIを公開すべきであるPHPのバックエンドサーバーにJSONデータを送信し、など

SLIM PHPについてはわかりません。それは要求を処理するようです。エラーメッセージを貼り付けることはできますか?

+0

私は、上記のコードをテスト後いくつかのエラーメッセージで更新しました。 @Blacksadが示唆しているように、もう少し読んでいくつもりです。 – jmk2142

関連する問題