Sto cercando di capire come Backbone.js, Slim PHP e Paris/Idiorm potrebbero funzionare insieme e sto avendo problemi a completare il flusso, a partire dai dati degli attributi del modello, fino al database. PROBLEMA: cosa viene inviato al mio server quando eseguo model.save()?Come caricare i dati del modello backbone in DB tramite Slim php e Paris
lato client: 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
Credo che quanto sopra è il mio problema principale. La mia comprensione è che il backbone, per impostazione predefinita, saprà inviare i dati POST dal momento che è nuovo. Lo invia a/donut che viene instradato, ma la domanda che ho è COSA viene inviata? E in quale formato? Il risultato che voglio è quello di salvare quegli attributi di ciambella sul mio DB. Posso passare questo codice lato server un JSON come questo utilizzando jQuery $ .post() ...
var myDonut = {"name":"Jelly Filled", "sparkles":false, "creamFilled":true};
$.post('http://localhost/donut', myDonut);
... e prende felicemente, lo salva al mio database. Ma con la configurazione corrente cercando di inviare i miei dati di donut backbone, ottengo POST 500 Internal Server Error. Di seguito ho un codice sul lato server.
lato server: Slim PHP w/Parigi
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
});
Ho la sensazione che la risposta è là fuori, ma tutti gli esempi che ho guardato sembra mancare un pezzo del puzzle o un altro e Non riesco a capire "A-hA!" momento. Vi ringrazio in anticipo e mi scuso se questa è una domanda davvero ignorante. :-P
SEGUITO/EDIT: 1
Potete incollare i messaggi di errore?
Ottengo un POST http://localhost:8888/donut 500 (Errore interno server) nello stato corrente. Posso ottenere maggiori informazioni con il seguente codice.
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);
}
});
Ora quando ho eseguito save(), ho ancora ottenere l'errore di spina dorsale 500, ma anche XMLHttpRequest come la mia risposta FAIL. L'unico notevole indizio da XMLHttpRequest è responseText = SQLSTATE [23000]: Violazione del vincolo di integrità: 1048 Il "nome" colonna non può essere nullo.
Quindi la mia ipotesi è che 1) Sto confondendo qualcosa con il save() in quanto non sta acquisendo correttamente i miei attributi, 2) Attualmente sta inviando i miei attributi in un formato che il mio server non è Riconoscimento con i metodi standard $ app-> request() -> post() Slim (Non sembra fare molto quando provo ad accedere direttamente con $ _POST), 3) Il mio server non è configurato correttamente per prendere il tipo di dati che viene inviato.
Un'altra cosa che ho notato, anche se non so che cosa fare di esso è che quando aggiungo
echo $_POST;
Si ritorna a me un array vuoto. Mi dà ancora il FAIL. Tuttavia, se lo faccio ...
echo json_encode($_POST);
Mi dà un SUCCESSO e la risposta è un []. Niente dentro. Chiaramente i miei dati POST sono ancora vistosi.
Sei un genio! per questo un plus per la domanda + risposta. Grazie! –
Ciao orangewarp, ho dovuto affrontare lo stesso problema qui usando Backbone e Slim. Trovo molto strano però che devi usare getBody() mentre è più appropriato usare post() o put() a seconda della tua richiesta. – Maarten
Puoi avere Slim analizza il JSON per te. Dovrai comunque chiamare getBody(). Il metodo post() della richiesta non rispetta l'analisi eseguita dal middleware ContentType e sembra gestire solo i dati del modulo. Dopo aver istanziato $ app, fai questo: $ app-> add (new \ Slim \ Middleware \ ContentTypes()); // Ottenere l'analisi JSON in entrata analizzata. Dopodiché, getBody() restituisce una bella serie di dati analizzati. –