2012-01-29 35 views
18

Tôi đang cố gắng hiểu cách Backbone.js, Slim PHPParis/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.

Trả lời

30

Tôi đã đưa ra một giải pháp để hoàn thành vấn đề: cách lấy dữ liệu từ máy khách đến máy chủ bằng cách sử dụng xương sống mặc định save() và .sync - chuyển qua khung công tác PHP php và đi qua Paris/Idiorm đến DB của tôi .

tôi bao gồm làm việc mã của tôi được cập nhật dưới đây:

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 
}); 

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); 
    } 
}); 
************************************************************/ 

Sever-side: Slim PHP w/Paris/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 
} 

Bây giờ mã của tôi là vui vẻ bằng cách sử dụng các thiết lập mặc định của Backbone.js (không có thay đổi để đồng bộ) và gửi đúng m thông tin thuộc tính odel cho máy chủ của tôi dường như đã chấp nhận thành công dữ liệu và lưu nó vào DB của tôi.

Mấu chốt ở đây có vẻ là dòng này ...

/* $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(); 
+0

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! –

+0

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

+0

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. –

1

Nếu bạn muốn biết "chính xác những gì được gửi đến máy chủ", bạn nên có một cái nhìn tại Backbone.sync function in Backbone's code. Nó là rất tốt tài liệu, từng bước. Sau đó, cách sạch nhất để đạt được những gì bạn cần là viết cho bạn chức năng đồng bộ hóa riêng, lấy cảm hứng từ sự đồng bộ của Backbone.

Ngoài ra, một cách nhanh chóng để xem nội dung được gửi tới máy chủ là sử dụng bảng điều khiển gỡ lỗi trình duyệt của bạn (tab Mạng). Bạn có thể so sánh ở đây những gì được gửi bởi Backbone so với những gì được gửi khi bạn sử dụng $ .post trực tiếp. Vui lòng đăng thông tin này nếu bạn cần thêm trợ giúp!

+0

tôi sẽ đọc lại tài liệu Backbone.sync. Sự hiểu biết của tôi cho đến nay là nó đã có một hành vi mặc định, mà tôi muốn hiểu! :-) Từ những gì tôi hiểu, phải mất các thuộc tính mô hình của tôi và tuần tự hóa chúng thành JSON, gửi nó, và nó mong đợi một JSON trả về từ máy chủ nếu tôi thay đổi đối tượng. Sử dụng ví dụ đã đăng của tôi, khi tôi làm ... bostonCream.save(); Tôi mong đợi một cái gì đó như ... {"tên": "Bawston Creme", "lấp lánh": đúng, "creamFilled": true} để được gửi. Nếu điều này là đúng, nó sẽ làm việc với mã trên của tôi nhưng nó không. Nghi ngờ! – jmk2142

+0

Ngoài ra, liên quan đến việc sử dụng bảng điều khiển. Với $ .post của jQuery có một callback thành công hay thất bại mà tôi có thể sử dụng để console.log (dữ liệu). Tôi có thể lặp lại $ _POST và xem những gì đang bị bắt hay không. Nhưng với Backbone, tôi không chắc chắn làm thế nào để nhìn thấy tiếng vang của tôi $ _POST. bostonCream.save() sẽ gửi yêu cầu và trả lại ... cái gì? Một cái gì đó như thế này có phải là cách chính xác để kiểm tra những gì đang được trả lại? bostonCream.save ({}, {success: function (model, response) {console.log ('THÀNH CÔNG'); console.log (response);}, lỗi {console.log ('FAIL'); console.log (phản ứng); } }); – jmk2142

+0

Xin lỗi tôi có nghĩa là "đọc mã nguồn xương sống" (Tôi đã đăng một liên kết đến tài liệu, lỗi của tôi). Trong backbone.sync bạn sẽ thấy điều gì xảy ra. – Blacksad

0

xương sống gửi dữ liệu json đến máy chủ php phụ trợ của bạn, mà bạn nên phơi bày api RESTful của bạn để đáp ứng http động từ như nhận được, bưu điện, đặt, xóa và vv

api phụ trợ của bạn có trách nhiệm giao tiếp với cơ sở dữ liệu .

Tôi không chắc chắn về SLIM PHP. có vẻ như để xử lý yêu cầu. Bạn có thể dán các thông báo lỗi không?

+0

Tôi đã cập nhật mã ở trên với một số thông báo lỗi khác sau khi thử nghiệm. Tôi sẽ làm một số đọc thêm như @Blacksad cho thấy. – jmk2142

Các vấn đề liên quan