Comment afficher les données du modèle de base à la base de données via Slim php et Paris

j'essaie de comprendre comment colonne vertébrale.js, Slim PHP et Paris / Idiorm pourrait fonctionner ensemble et j'ai de la difficulté à compléter le flux, en commençant par les données des attributs du modèle, jusqu'à la base de données. Problème: ce qui est envoyé exactement à mon serveur lorsque je fais le model.enregistrer() ?

côté Client: colonne vertébrale.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

je pense que le ci-dessus est mon principal problème. Ma compréhension est que l'épine dorsale par par défaut, savoir envoyer des données POST depuis qu'il est nouveau. Il l'envoie à / donut qui est routé, mais la question que j'ai est QU'est-ce qu'il envoie? Et dans quel format? Le résultat que je veux est de sauver ces attributs de donut à mon DB. Je peux passer ce code côté serveur un json comme ça en utilisant jQuery $.post.)(..

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

...et heureusement qu'il le prend, l'enregistre dans ma base de données. Mais avec la configuration actuelle essayant d'envoyer mes données donut de base, J'obtiens une erreur de serveur interne POST 500. Ci-dessous, j'ai quelques le code côté serveur.

Côté Serveur: 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
});

j'ai le sentiment que la réponse est là, mais chaque exemple que j'ai regardé semble manquer une pièce du puzzle ou une autre et je ne peux pas obtenir que "a-hA!" moment. Je vous remercie d'avance et m'excuse si c'est vraiment un ignorant la question. :- P

FOLLOWUP / EDIT: 1

Pouvez-vous coller les messages d'erreur?

- je obtenir un POST http://localhost:8888/donut 500 (Erreur du serveur interne) dans l'état actuel. Je peux obtenir plus d'informations avec le code suivant.

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

maintenant, quand j'exécute le save () de backbone, J'obtiens quand même l'erreur 500 mais aussi XMLHttpRequest comme réponse D'échec. Le seul indice remarquable de la XMLHttpRequest est responsabiletext = SQLSTATE [23000]: Integrity constraint violation: 1048 Column 'name' cannot be null.

donc à mon avis, soit 1) je touche quelque chose de nouveau avec le save() en ce qu'il ne capture pas mes attributs correctement, 2) Il envoie actuellement mes attributs dans un format que mon serveur ne reconnaît pas avec les méthodes standard $app->request()->post() Slim (ne semble pas faire grand chose lorsque j'essaie d'accéder directement avec $_POST non plus), 3) Mon serveur n'est pas configuré correctement pour prendre le type de données qui est envoyé.

une autre chose que j'ai remarquée bien que je ne sais pas quoi en faire est que quand je ajouter

echo $_POST;

Il me renvoie un tableau vide. Ça me donne encore l'échec. Si je fais CELA, cependant...

echo json_encode($_POST);

Il me donne un SUCCÈS et que la réponse est un [ ]. Rien là-dedans. Il est clair que mes données POST sont toujours fausses.

18
demandé sur jmk2142 2012-01-29 17:09:17

3 réponses

j'ai trouvé une solution pour compléter le problème: comment obtenir des données d'un client à un serveur en utilisant le backbone par défaut save() and .sync - passé à l'Slim framework php et en passant par Paris/Idiorm à ma DB.

je joins à la présente mon travail de mise à jour de code ci-dessous:

côté Client: colonne vertébrale.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
}

maintenant mon code est heureux d'utiliser la valeur par défaut les paramètres de la colonne vertébrale.js (no changes to sync) et l'envoi d'informations appropriées sur les attributs du modèle à mon serveur qui semble bien accepter les données et les sauvegarder dans ma base de données.

la clé ici semble être cette ligne...

/* $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();
30
répondu jmk2142 2012-02-01 06:39:26

si vous voulez savoir "ce qui est envoyé exactement au serveur", vous devriez jeter un oeil à la colonne vertébrale.la fonction de synchronisation de la colonne vertébrale du code. Il est très bien documenté, étape par étape. Ensuite, la façon la plus propre d'atteindre ce dont vous avez besoin est d'écrire votre propre fonction de synchronisation, inspirée de la synchronisation de Backbone.

Aussi, un moyen rapide de voir ce qui est envoyé au serveur, utilisez votre navigateur pour console de débogage (onglet Réseau). Vous pouvez comparer ici ce qui est envoyé par Backbone vs. ce qui est envoyé quand vous utilisez $.poste directement. Merci de poster cette information si vous avez besoin de plus d'aide !

1
répondu Blacksad 2012-01-29 15:55:45

backbone envoie des données json à votre serveur d'arrière-plan php, que vous devriez exposer votre api RESTful pour répondre au verbe http comme get, post, put, delete et etc.

votre api backend est responsable de la communication avec la base de données.

Je ne suis pas sûr de SLIM PHP. il semble que pour répondre à la demande. Pouvez-vous coller les messages d'erreur?

0
répondu dvliman 2012-01-29 18:23:28