Как отправить данные модели магистрали в БД через Slim php и Paris - PullRequest
18 голосов
/ 29 января 2012

Я пытаюсь понять, как Backbone.js , Slim PHP и Paris / Idiorm могут работать вместе, и у меня возникают проблемы завершение потока, начиная с данных атрибута модели, вплоть до базы данных. ПРОБЛЕМА: Что именно отправляется на мой сервер, когда я делаю model.save ()?

Клиентская сторона: 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

Я думаю, что это моя главная проблема. Насколько я понимаю, магистраль по умолчанию будет знать, отправлять ли данные POST, поскольку она новая. Он отправляет его в / donut, который маршрутизируется, но у меня есть вопрос ЧТО он отправляет? И в каком формате? В результате я хочу сохранить эти атрибуты пончика в моей базе данных. Я могу передать этот код на стороне сервера json, как это, используя jQuery $ .post () ...

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

... и он с радостью принимает его, сохраняет в моей базе данных. Но с текущей настройкой, пытающейся отправить мои данные пончика магистрали, я получаю POST 500 Internal Server Error. Ниже у меня есть некоторый код на стороне сервера.

Серверная часть: тонкий PHP с Парижем

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

У меня такое чувство, что ответ там, но каждый пример, на который я смотрел, кажется, пропускает тот или иной кусок головоломки, и я не могу получить это "А-ха!" момент. Я заранее благодарю вас и прошу прощения, если это действительно невежественный вопрос. : -Р

FOLLOWUP / EDIT: 1

Можете ли вы вставить сообщения об ошибках?

Я получаю POST http://localhost:8888/donut 500 (Внутренняя ошибка сервера) в текущем состоянии. Я могу получить больше информации с помощью следующего кода.

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

Теперь, когда я запускаю опцию save (), я по-прежнему получаю 500 Ошибка, но и XMLHttpRequest в качестве ответа FAIL. Единственный замечательный признак XMLHttpRequest - responseText = SQLSTATE [23000]: нарушение ограничения целостности: 1048 Имя столбца не может быть пустым.

Так что я предполагаю, что либо: 1) я что-то напутал с функцией save () в том, что она неправильно захватывает мои атрибуты, 2) в настоящее время она отправляет мои атрибуты в формате, который не мой сервер распознавание стандартными методами $ app-> request () -> post () Slim (похоже, что при попытке прямого доступа с помощью $ _POST ничего особенного не получается), 3) Мой сервер не настроен правильно, чтобы принять вид отправляемых данных.

Еще одна вещь, которую я заметил, хотя я не знаю, что с этим делать, это то, что когда я добавляю

echo $_POST;

Возвращает мне пустой массив. Все еще дает мне неудачу. Если я это сделаю, однако ...

echo json_encode($_POST);

Это дает мне УСПЕХ, и ответом является []. Там ничего нет. Ясно, что мои данные POST все еще шаткие.

Ответы [ 3 ]

30 голосов
/ 30 января 2012

Я нашел решение для решения этой проблемы: как получить данные от клиента к серверу, используя стандартные магистрали save () и .sync - переданные в фреймворк Slim php и через Paris / Idiorm к моей БД.

Я включил мой рабочий обновленный код ниже:

На стороне клиента: 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);
    }
});
************************************************************/

С другой стороны: Тонкий PHP с Парижем / Идорм

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
}

Теперь мой код успешно использует стандартные настройки Backbone.js (без изменений для синхронизации) и отправляет правильную информацию об атрибутах модели на мой сервер, который, похоже, успешно принимает данные и сохраняет их в моей БД.

Ключ здесь, кажется, эта строка ...

/* $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();
1 голос
/ 29 января 2012

Если вы хотите знать, «что именно отправляется на сервер», вам нужно взглянуть на функцию Backbone.sync в коде Backbone . Это очень хорошо задокументировано, пошагово. Тогда самый простой способ достичь того, что вам нужно, - написать собственную функцию синхронизации, вдохновленную синхронизацией Backbone.

Кроме того, быстрый способ узнать, что отправляется на сервер, - это использовать консоль отладки браузера (вкладка «Сеть»). Здесь вы можете сравнить то, что отправляет Backbone, с тем, что отправляется, когда вы напрямую используете $ .post. Пожалуйста, оставьте эту информацию, если вам нужна дополнительная помощь!

0 голосов
/ 29 января 2012

backbone отправляет данные json на ваш бэкэнд-сервер php, которые вы должны предоставить своему RESTful api для ответа на глагол http: get, post, put, delete и т. Д.база данных.

Я не уверен насчет SLIM PHP.кажется, чтобы обработать запрос.Вы можете вставить сообщения об ошибках?

...