Próbuję zrozumieć, w jaki sposób mogą współpracować ze sobą Backbone.js, Slim PHP i Paris/Idiorm. Mam problem z ukończeniem przepływu, zaczynając od danych atrybutów modelu, aż do bazy danych. PROBLEM: Co dokładnie jest wysyłane do mojego serwera, gdy wykonuję model.save()?Jak umieścić dane modelu szkieletowego w DB przez Slim php i Paryż
Client-side: 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
myślę, że powyżej jest mój główny problem. Rozumiem, że szkielet domyślnie będzie wiedział, że wysyła dane POST, ponieważ jest nowy. Wysyła go do/donut, który jest routowany, ale pytanie, które mam, to CO wysyła? I w jakim formacie? Rezultatem, którego chcę, jest zapisanie tych atrybutów pączków do mojego DB. Mogę przekazać ten kod po stronie serwera do json jak to przy użyciu jQuery $ .post() ...
var myDonut = {"name":"Jelly Filled", "sparkles":false, "creamFilled":true};
$.post('http://localhost/donut', myDonut);
... i to szczęśliwie bierze, zapisuje go do mojej bazy danych. Ale przy obecnej konfiguracji próbującej wysyłać dane mojego głównego szkieletu, otrzymuję błąd wewnętrznego serwera POST 500. Poniżej mam kod po stronie serwera.
po stronie serwera: Slim PHP w/Paryż
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
});
Mam wrażenie odpowiedź jest gdzieś tam, ale każdy przykład Sprawdziliśmy wydaje się, że brakuje jednego kawałka układanki lub inny i Nie mogę dostać tego "A-hA!" za chwilę. Z góry dziękuję i przepraszam, jeśli to naprawdę niedorzeczne pytanie. :-P
obserwacji/EDIT: 1
można wkleić komunikaty o błędach?
Otrzymuję POST http://localhost:8888/donut 500 (Wewnętrzny błąd serwera) w bieżącym stanie. Mogę uzyskać więcej informacji za pomocą następującego kodu.
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);
}
});
Teraz gdy uruchamiam szkieletowej za save(), wciąż otrzymuję błąd 500, ale także XMLHttpRequest jako moją odpowiedź zawiedzie. Jedyną niezwykłą wskazówką z XMLHttpRequest jest responseText = SQLSTATE [23000]: Naruszenie ograniczenia integralności: 1048 Kolumna "name" nie może mieć wartości NULL.
Zgaduję, że albo 1) coś zepsuję z save(), ponieważ nie przechwytuje poprawnie moich atrybutów, 2) Obecnie wysyła moje atrybuty w formacie, który nie jest moim serwerem. • rozpoznawanie za pomocą standardowych metod $ app-> request() -> post() Slim (nie wydaje się zbytnio robić, gdy próbuję uzyskać dostęp bezpośrednio za pomocą $ _POST), 3) Mój serwer nie jest poprawnie skonfigurowany do pobierania rodzaj danych, które są wysyłane.
Inną rzeczą, jaką zauważyłem, chociaż nie wiem, co zrobić z tym jest to, że kiedy dodać
echo $_POST;
To powraca do mnie pustą tablicę. Nadal daje mi FAIL. Jeśli jednak to zrobię ...
echo json_encode($_POST);
Daje mi SUKCES, a odpowiedź jest []. Nic tam nie ma. Najwyraźniej moje dane POST są wciąż niewyraźne.
Jesteś genialny! za to plus za pytanie + odpowiedź. Dzięki! –
Cześć orangewarp, ja walczyłem z tym samym problemem tutaj, używając Backbone i Slim. Uważam za bardzo dziwne, że musisz użyć getBody(), podczas gdy bardziej odpowiednie jest użycie post() lub put() w zależności od twojego żądania. – Maarten
Możesz mieć Slim analizować JSON dla ciebie. Nadal będziesz musiał wywołać getBody(). Metoda post() żądania nie uwzględnia analizy składniowej oprogramowania pośredniego ContentType i wydaje się zajmować tylko danymi formularza. Po utworzeniu aplikacji $ wykonaj następujące czynności: $ app-> add (new \ Slim \ Middleware \ ContentTypes()); // Pobierz przeanalizowany przychodzący JSON. Następnie getBody() zwraca ładną tablicę analizowanych danych. –