Подтвердить что ты не робот

Как получить данные базовой модели POST в DB через 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". Ниже у меня есть код на стороне сервера.

Серверная сторона: 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
});

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

FOLLOWUP/EDIT: 1

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

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

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

Теперь, когда я запускаю backbone 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 по-прежнему неустойчивы.

4b9b3361

Ответ 1

Я придумал решение для решения проблемы: как получить данные от клиента на сервер, используя по умолчанию backbone 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 с Парижем /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
}

Теперь мой код с радостью использует настройки по умолчанию для 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();

Ответ 2

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

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

Ответ 3

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

ваш backend api отвечает за связь с базой данных.

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