Cómo POSTAR los datos del modelo de red troncal a DB a través de Slim php y París

Estoy tratando de comprender cómo Backbone.js , Slim PHP y Paris / Idiorm podrían funcionar juntos y tengo problemas para completar el flujo, comenzando con los datos de los atributos del modelo, todo el camino hasta la base de datos. PROBLEMA: ¿Qué se envía exactamente a mi servidor cuando hago model.save ()?

Del lado del cliente: 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 

Creo que lo de arriba es mi problema principal. Tengo entendido que, por defecto, la red troncal sabrá enviar datos POST ya que son nuevos. Lo envía a / donut que se enruta, pero la pregunta que tengo es ¿QUÉ envía? ¿Y en qué formato? El resultado que quiero es guardar esos atributos donut en mi DB. Puedo pasar este código del lado del servidor un json como este usando jQuery $ .post () …

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

… y felizmente lo toma, lo guarda en mi base de datos. Pero con la configuración actual tratando de enviar los datos de mi donación de red troncal, recibo el POST 500 Internal Server Error. A continuación tengo un código del lado del servidor.

Del lado del servidor: 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 }); 

Tengo la sensación de que la respuesta está ahí, pero cada ejemplo que he visto parece estar perdiendo una pieza del rompecabezas u otro y no puedo obtener ese “A-hA”. momento. Te agradezco de antemano y me disculpo si esta es una pregunta realmente ignorante. :-PAG

SEGUIMIENTO / EDICION: 1

¿Puedes pegar los mensajes de error?

Obtengo un POST http: // localhost: 8888 / donut 500 (Internal Server Error) en el estado actual. Puedo obtener más información con el siguiente código.

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

Ahora cuando ejecuto save () de backbone, sigo obteniendo 500 Error pero también XMLHttpRequest como mi respuesta FAIL. La única pista notable de XMLHttpRequest es responseText = SQLSTATE [23000]: Integrity constraint violation: 1048 El ‘nombre’ de columna no puede ser nulo.

Así que mi suposición es que o bien 1) Estoy arruinando algo con save () en cuanto a que no está capturando mis atributos correctamente, 2) Actualmente estoy enviando mis atributos en un formato que mi servidor no reconoce con el estándar $ app-> request () -> post () Métodos delgados (No parece hacer mucho cuando bash acceder directamente con $ _POST tampoco), 3) Mi servidor no está configurado correctamente para tomar el tipo de datos que está siendo enviado.

Otra cosa que noté aunque no sé qué pensar es que cuando agrego

 echo $_POST; 

Me devuelve una matriz vacía. Todavía me da el FAIL. Si hago ESTO sin embargo …

 echo json_encode($_POST); 

Me da un ÉXITO y la respuesta es un []. Nada allí. Claramente, mis datos de POST aún son escasos.

Se me ocurrió una solución para completar el problema: cómo obtener datos del cliente al servidor utilizando la estructura principal predeterminada save () y .sync, transferida al framework Slim php y pasando por Paris / Idiorm hasta mi base de datos.

Estoy incluyendo mi código actualizado de trabajo a continuación:

Del lado del cliente: 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); } }); ************************************************************/ 

Sever-side: 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 } 

Ahora mi código está felizmente usando la configuración predeterminada de Backbone.js (sin cambios para sincronizar) y enviando la información del atributo de modelo adecuado a mi servidor que parece aceptar los datos y guardarlos en mi base de datos.

La clave aquí parece ser esta línea …

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

Si desea saber “qué se envía exactamente al servidor”, debería echar un vistazo a la función Backbone.sync en el código de Backbone . Está muy bien documentado, paso a paso. Entonces, la forma más limpia de lograr lo que necesita es escribir su propia función de sincronización, inspirada en la sincronización del Backbone.

Además, una forma rápida de ver lo que se envía al servidor es usar la consola de depuración del navegador (pestaña Red). Aquí puedes comparar lo que se envía por Backbone con lo que se envía cuando usas $ .post directamente. ¡Publique esta información si necesita más ayuda!

la red troncal envía datos json a su servidor php backend, que debe exponer su API REST para responder al verbo http como get, post, put, delete y etc.

su API de fondo es responsable de comunicarse con la base de datos.

No estoy seguro sobre SLIM PHP. parece manejar la solicitud. ¿Puedes pegar los mensajes de error?