Как получить данные базовой модели 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 по-прежнему неустойчивы.
Ответы
Ответ 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. он, похоже, обрабатывает запрос. Можете ли вы вставить сообщения об ошибках?