Tôi đang cố gắng hiểu cách Backbone.js, Slim PHP và Paris/Idiorm có thể hoạt động cùng nhau và tôi gặp sự cố khi hoàn thành luồng, bắt đầu với dữ liệu thuộc tính mô hình, tất cả các cách để cơ sở dữ liệu. VẤN ĐỀ: Chính xác những gì được gửi đến máy chủ của tôi khi tôi làm model.save()?Cách đăng dữ liệu mô hình đường trục tới DB thông qua Slim php và Paris
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
Tôi nghĩ rằng ở trên là vấn đề chính của tôi. Sự hiểu biết của tôi là xương sống sẽ theo mặc định, biết gửi dữ liệu POST vì nó mới. Nó gửi nó đến/donut được định tuyến, nhưng câu hỏi tôi có là nó gửi gì? Và ở định dạng nào? Kết quả tôi muốn là để lưu các thuộc tính bánh rán cho DB của tôi. Tôi có thể chuyển mã phía máy chủ này thành json như thế này bằng cách sử dụng jQuery $ .post() ...
var myDonut = {"name":"Jelly Filled", "sparkles":false, "creamFilled":true};
$.post('http://localhost/donut', myDonut);
... và vui vẻ mang nó, lưu vào cơ sở dữ liệu của tôi. Nhưng với thiết lập hiện tại đang cố gắng gửi dữ liệu đường vòng của tôi, tôi nhận được lỗi máy chủ nội bộ POST 500. Dưới đây tôi có một số mã phía máy chủ.
Server-side: 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
});
Tôi có cảm giác câu trả lời là trên mạng, nhưng mỗi ví dụ tôi đã nhìn dường như bị thiếu một mảnh ghép này hay cách khác và Tôi không thể có được "A-hA!" chốc lát. Tôi cảm ơn bạn trước và xin lỗi nếu đây là một câu hỏi thực sự không biết gì. :-P
followup/EDIT: 1
Bạn có thể dán các thông báo lỗi?
Tôi nhận được POST http://localhost:8888/donut 500 (Lỗi máy chủ nội bộ) ở trạng thái hiện tại. Tôi có thể lấy thêm thông tin với mã sau đây.
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);
}
});
Bây giờ khi tôi chạy backbone's save(), tôi vẫn nhận được lỗi 500 nhưng cũng XMLHttpRequest làm phản hồi FAIL của tôi. Các đầu mối đáng chú ý duy nhất từ XMLHttpRequest là responseText = SQLSTATE [23000]: Vi phạm ràng buộc toàn vẹn: 1048 Cột 'tên' không thể là rỗng. Vì vậy, tôi đoán là 1) Tôi đang làm rối một cái gì đó với lưu() trong đó nó không nắm bắt các thuộc tính của tôi một cách chính xác, 2) Nó hiện đang gửi thuộc tính của tôi trong một định dạng mà máy chủ của tôi không phải là ' t công nhận với các tiêu chuẩn $ app-> request() -> post() Slim phương pháp (Không có vẻ làm nhiều khi tôi thử truy cập trực tiếp với $ _POST hoặc), 3) Máy chủ của tôi không được thiết lập chính xác để lấy loại dữ liệu đang được gửi.
Một điều tôi nhận thấy mặc dù tôi không biết phải làm gì với nó là khi tôi thêm
echo $_POST;
Nó trả về cho tôi một mảng trống. Vẫn cho tôi FAIL. Tuy nhiên, nếu tôi làm như vậy ...
echo json_encode($_POST);
Nó mang lại cho tôi THÀNH CÔNG và phản hồi là []. Không có gì trong đó. Rõ ràng dữ liệu POST của tôi vẫn còn rất tuyệt vời.
Bạn là một người giàu có! cho rằng một cộng cho câu hỏi + câu trả lời. Cảm ơn! –
Hi orangewarp, tôi đã đấu tranh với cùng một vấn đề ở đây bằng cách sử dụng Backbone và Slim. Tôi tìm thấy nó rất lạ mặc dù bạn phải sử dụng getBody() trong khi nó là thích hợp hơn để sử dụng post() hoặc put() tùy thuộc vào yêu cầu của bạn. – Maarten
Bạn có thể phân tích cú pháp JSON cho bạn. Bạn vẫn sẽ cần gọi hàm getBody(). Phương thức post() của yêu cầu không tôn trọng việc phân tích cú pháp mà middleware ContentType đã làm, và dường như chỉ xử lý dữ liệu biểu mẫu. Sau khi tạo ứng dụng $, hãy thực hiện điều này: $ app-> add (new \ Slim \ Middleware \ ContentTypes()); // Nhận JSON được phân tích cú pháp đến. Sau đó, getBody() trả về một mảng dữ liệu được phân tích cú pháp tốt đẹp. –