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