Как отправить данные модели магистрали в БД через Slim php и Paris

Я пытаюсь понять, как 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
});

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

ПОСЛЕДУЮЩАЯ / РЕДАКТИРОВАТЬ: 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 Error, а также XMLHttpRequest в качестве ответа FAIL. Единственный замечательный признак XMLHttpRequest - responseText = SQLSTATE[23000]: нарушение ограничения целостности: 1048 Имя столбца не может быть пустым.

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

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

echo $_POST;

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

echo json_encode($_POST);

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

3 ответа

Решение

Я придумал решение этой проблемы: как получить данные от клиента к серверу, используя стандартные магистрали 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();

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

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

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

Ваш сервер API отвечает за связь с базой данных.

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

Другие вопросы по тегам