tutorial skeleton instalar framework example con composer php json backbone.js slim idiorm

skeleton - Cómo POST datos de modelo de red troncal a DB a través de Slim php y París



slim skeleton (3)

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

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 anterior es mi principal problema. Mi entendimiento es que la red troncal por defecto, sabrá enviar datos POST ya que es nuevo. 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 de dona en mi base de datos. Puedo pasar este código del lado del servidor a 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 que intenta enviar los datos de la dona de mi red troncal, recibo POST 500 Internal Server Error. A continuación tengo un código del lado del servidor.

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í fuera, pero cada ejemplo que he visto parece que falta una pieza del rompecabezas u otra y no puedo obtener ese "A-hA!" momento. Les agradezco de antemano y les pido disculpas 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 (Error interno del servidor) 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 el backbone''s save (), todavía obtengo el Error 500, pero también XMLHttpRequest como mi respuesta FALL. La única pista destacable de XMLHttpRequest es responseText = SQLSTATE [23000]: infracción de restricción de integridad: 1048 El ''nombre'' de la columna no puede ser nulo.

Entonces, supongo que o bien 1) estoy arruinando algo con save () en el sentido de que no está capturando mis atributos correctamente, 2) Actualmente está enviando mis atributos en un formato que mi servidor no reconoce con el $ app-> request () -> post () Slim métodos (No parece hacer mucho cuando intento 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é hacer es que cuando agrego

echo $_POST;

Me devuelve una matriz vacía. Todavía me da el error. Si hago esto sin embargo ...

echo json_encode($_POST);

Me da un ÉXITO y la respuesta es un []. No hay nada allí. Claramente, mis datos POST siguen siendo confusos.


Se me ocurrió una solución para completar el problema: cómo obtener datos del cliente al servidor usando el backbone predeterminado guardar () y .sync: pasé al marco de trabajo de Slim Php y pasé por Paris / Idiorm a mi base de datos.

Incluyo mi código de trabajo actualizado a continuación:

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 información de atributo de modelo adecuada a mi servidor, que parece estar aceptando los datos con éxito y guardándolos 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 necesitas es escribir tu propia función de sincronización, inspirada en la sincronización de Backbone.

Además, una forma rápida de ver lo que se envía al servidor es usar la consola de depuración de su navegador (pestaña Red). Aquí puede comparar lo que envía Backbone contra lo que se envía cuando usa $ .post directamente. Por favor, publica esta información si necesitas más ayuda!


backbone envía datos json a su servidor de back-end php, que debe exponer su API RESTful para responder al verbo http como obtener, publicar, poner, eliminar y etc.

su api backend es responsable de comunicarse con la base de datos.

No estoy seguro de SLIM PHP. Parece manejar la petición. ¿Puedes pegar los mensajes de error?