Estoy tratando de obtener una comprensión de cómo Backbone.js, Slim PHP y Paris/Idiorm podrían trabajar juntos y estoy teniendo problemas para completar el flujo, comenzando con el modelo de datos de atributos, todo el camino a la base de datos. PROBLEMA: ¿Qué se envía exactamente a mi servidor cuando hago model.save()?la forma de publicar los datos del modelo espina dorsal a través de DB php delgado y París
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 anterior es mi principal problema. 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. Me puede pasar el código del lado del servidor de un JSON como esto usando jQuery $ .post() ...
var myDonut = {"name":"Jelly Filled", "sparkles":false, "creamFilled":true};
$.post('http://localhost/donut', myDonut);
... y felizmente se lo lleva, 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: Delgado PHP w/París
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 es por ahí, pero todos los ejemplos que he mirado parece que falta una pieza del rompecabezas u otro y No puedo entender "A-hA!" momento. Te agradezco de antemano y me disculpo si esta es una pregunta realmente ignorante. :-P
SEGUIMIENTO/EDIT: 1
¿Puede pegar los mensajes de error?
Aparece el mensaje 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 en que funciono a save(), sigo teniendo el 500 Error de columna vertebral, sino también XMLHttpRequest como mi respuesta fallar. 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 el guardado() en el sentido de que no está capturando mis atributos correctamente, 2) Actualmente estoy enviando mis atributos en un formato que mi servidor no está t reconociendo con el estándar $ app-> request() -> post() Métodos delgados (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 se envían.
Otra cosa que he notado, aunque no sé qué hacer con él es que cuando agrego
echo $_POST;
Vuelve a mí una matriz vacía. Todavía me da el FAIL. Si lo hago 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.
¡Eres un genio! para eso una ventaja para la pregunta + respuesta. ¡Gracias! –
Hola orangewarp, he estado luchando con el mismo problema aquí usando Backbone y Slim. Me resulta muy extraño, sin embargo, que tengas que usar getBody() mientras que es más apropiado usar post() o put() dependiendo de tu solicitud. – Maarten
Puede hacer que Slim analice el JSON por usted. Aún deberá llamar a getBody(). El método post() de la solicitud no respeta el análisis que realizó el middleware ContentType, y parece que solo trata los datos del formulario. Después de instanciar $ app, haga esto: $ app-> add (new \ Slim \ Middleware \ ContentTypes()); // Obtenga el JSON entrante analizado. Después de eso, getBody() devuelve una buena matriz de datos analizados. –