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データは新しいので送信することを知っています。それはルーティングされる/ドーナツに送信しますが、私が持っている質問はそれが何を送信するのかということです。どの形式ですか?必要な結果は、これらのドーナツ属性を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データはまだ不安定です。
私は問題を完了するための解決策を思いつきました:デフォルトのバックボーン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();
「サーバーに正確に何が送信されるか」を知りたい場合は、 BackboneのコードのBackbone.sync関数 を確認する必要があります。それは非常によく文書化されており、段階的に説明されています。次に、必要なことを実現するための最もクリーンな方法は、Backboneの同期に触発された独自の同期関数を作成することです。
また、サーバーに何が送信されているかをすばやく確認するには、ブラウザーのデバッグコンソール([ネットワーク]タブ)を使用します。ここで、Backboneによって送信されるものと、$。postを直接使用したときに送信されるものを比較できます。さらにヘルプが必要な場合は、この情報を投稿してください。
バックボーンはjsonデータをphpバックエンドサーバーに送信します。これは、get、post、put、deleteなどのhttp動詞に応答するようにRESTfulAPIを公開する必要があります。
バックエンドAPIは、データベースとの通信を担当します。
SLIMPHPについてはよくわかりません。リクエストを処理しているようです。エラーメッセージを貼り付けることはできますか?