Я пытаюсь понять, как 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!». момент. Я благодарю вас заранее и извиняюсь, если это действительно неосведомленный вопрос. :-П
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's 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 по-прежнему неустойчивы.
Я придумал решение для решения проблемы: как получить данные от клиента на сервер, используя по умолчанию 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();
Если вы хотите узнать, что именно отправлено на сервер, вы должны посмотреть на функцию Backbone.sync в коде Backbone . Это очень хорошо документировано, шаг за шагом. Тогда самый чистый способ добиться того, что вам нужно, – написать вам собственную функцию синхронизации, вдохновленную синхронизацией Backbone.
Кроме того, быстрый способ увидеть, что отправлено на сервер, – использовать консоль отладки браузера (вкладка «Сеть»). Вы можете сравнить здесь то, что отправлено Backbone по сравнению с тем, что отправлено, когда вы напрямую используете $ .post. Если вам нужна дополнительная помощь, отправьте эту информацию!
backbone отправляет данные json на ваш сервер php backend, который вы должны подвергать RESTful api ответам на http-глагол, например get, post, put, delete и т. д.
ваш backend api отвечает за связь с базой данных.
Я не уверен в SLIM PHP. он, похоже, обрабатывает запрос. Можете ли вы вставить сообщения об ошибках?