2012-01-29 11 views
18

के माध्यम से डीबी के लिए रीढ़ की हड्डी मॉडल डेटा पोस्ट, मैं कैसे Backbone.js, Slim PHP और Paris/Idiorm एक साथ काम कर सकते हैं की एक समझ पाने के लिए कोशिश कर रहा हूँ और मैं मुसीबत, प्रवाह को पूरा मॉडल के साथ डेटा शुरू करने विशेषता आ रही करने के लिए डेटाबेस के लिए सभी तरह से। समस्या: जब मैं model.save() करता हूं तो मेरे सर्वर पर वास्तव में क्या भेजा जाता है?कैसे स्लिम php और पेरिस

क्लाइंट-साइड: 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 

मुझे लगता है कि इसके बाद के संस्करण मेरी मुख्य समस्या है। मेरी समझ यह है कि रीढ़ की हड्डी डिफ़ॉल्ट रूप से होगी, क्योंकि यह नया है क्योंकि पोस्ट डेटा भेजना है। यह इसे भेजने/डोनट भेजता है, लेकिन मेरे पास सवाल यह है कि यह क्या भेजता है? और किस प्रारूप में? मुझे जो परिणाम चाहिए वो डोनट विशेषताओं को मेरे डीबी में सहेजना है। मैं इस का उपयोग कर jQuery $ .post() की तरह इस सर्वर-साइड कोड एक json पारित कर सकते हैं ...

var myDonut = {"name":"Jelly Filled", "sparkles":false, "creamFilled":true}; 
$.post('http://localhost/donut', myDonut); 

... और यह खुशी से यह लगता है, मेरी डेटाबेस के लिए यह बचाता है। लेकिन वर्तमान सेटअप के साथ मेरा रीढ़ की हड्डी डोनट डेटा भेजने की कोशिश कर रहा है, मुझे पोस्ट 500 आंतरिक सर्वर त्रुटि मिलती है। नीचे मेरे पास कुछ सर्वर-साइड कोड है।

सर्वर साइड: स्लिम पीएचपी डब्ल्यू/पेरिस

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

मैं एक जवाब महसूस कर रही है वहाँ बाहर है, लेकिन हर उदाहरण मैं देखा है पहेली का एक टुकड़ा कमी रह गई है या कोई अन्य और मुझे वह नहीं मिल सकता है "ए-एचए!" पल। मैं अग्रिम धन्यवाद और क्षमा चाहता हूं अगर यह वास्तव में अज्ञानी प्रश्न है। :-P

अनुसरण करे/संपादित करें: 1

आपको त्रुटि संदेश पेस्ट कर सकते हैं?

मुझे वर्तमान स्थिति में एक पोस्ट 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); 
    } 
}); 

अब जब मैं रीढ़ की हड्डी के 500 त्रुटि को बचाने(), मैं अभी भी मिल XMLHttpRequest मेरी असफल प्रतिक्रिया के रूप में चलाने पर भी। XMLHttpRequest से एकमात्र उल्लेखनीय सुराग प्रतिक्रिया है पाठ = SQLSTATE [23000]: ईमानदारी बाधा उल्लंघन: 1048 कॉलम 'नाम' शून्य नहीं हो सकता है।

तो मेरा अनुमान है कि या तो 1) मैं बचत() के साथ कुछ गड़बड़ कर रहा हूं जिसमें यह मेरे गुणों को सही तरीके से कैप्चर नहीं कर रहा है, 2) यह वर्तमान में मेरे गुणों को एक प्रारूप में भेज रहा है जो मेरा सर्वर नहीं है ' मानक $ ऐप-> अनुरोध() -> पोस्ट() स्लिम विधियों के साथ पहचान नहीं है (जब मैं $ _POST के साथ सीधे पहुंचने का प्रयास करता हूं तो बहुत कुछ नहीं लगता है), 3) मेरा सर्वर सही तरीके से सेटअप करने के लिए सेटअप नहीं है भेजा जा रहा डेटा का प्रकार।

एक और बात मैंने देखा है, हालांकि मैं नहीं जानता कि क्या यह सुनिश्चित करने के लिए कि जब मैं

echo $_POST; 

जोड़ने यह एक खाली सरणी मेरे लिए रिटर्न है। अभी भी मुझे असफल देता है। अगर मैं ऐसा करता हूं ...

echo json_encode($_POST); 

यह मुझे एक सफलता देता है और प्रतिक्रिया एक [] है। वहां कुछ भी नहीं है। स्पष्ट रूप से मेरा पोस्ट डेटा अभी भी भद्दा है।

उत्तर

30

मैं समस्या को पूरा करने के लिए एक समाधान के साथ आया: डिफ़ॉल्ट बैकबोन सेव() और .sync का उपयोग कर क्लाइंट से सर्वर तक डेटा कैसे प्राप्त करें - स्लिम PHP फ्रेमवर्क पर पारित किया गया है और मेरे डीबी में पेरिस/इडियॉर्म के माध्यम से जा रहा है ।

मैं अपने काम कर अद्यतन नीचे कोड सहित हूँ:

क्लाइंट-साइड: 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 साइड: स्लिम पीएचपी डब्ल्यू/पेरिस/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 
} 

अब मेरा कोड खुशी से बैकबोन.जेएस (सिंक में कोई बदलाव नहीं) की डिफ़ॉल्ट सेटिंग्स का उपयोग कर रहा है और उचित मीटर भेज रहा है लगता है कि मेरे सर्वर पर odel विशेषता जानकारी जो डेटा को सफलतापूर्वक स्वीकार कर रही है और इसे मेरे डीबी में सहेज रही है।

कुंजी यहाँ इस लाइन हो रहा है ...

/* $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

आप एक genious हैं! इसके लिए प्रश्न + उत्तर के लिए एक प्लस। धन्यवाद! –

+0

हाय ऑरंगवार्प, मैं बैकबोन और स्लिम का उपयोग करके यहां एक ही मुद्दे के साथ संघर्ष कर रहा हूं। मुझे यह बहुत अजीब लगता है कि आपको getBody() का उपयोग करना है, जबकि आपके अनुरोध के आधार पर पोस्ट() या put() का उपयोग करना अधिक उचित है। – Maarten

+0

आप के लिए JSON स्लिम पार्स हो सकता है। आपको अभी भी GetBody() को कॉल करने की आवश्यकता होगी। अनुरोध की पोस्ट() विधि उस सामग्री को सम्मानित नहीं करती है जो ContentType Middleware ने किया था, और केवल फ़ॉर्म डेटा से निपटने के लिए प्रतीत होता है। $ ऐप को तुरंत चालू करने के बाद, यह करें: $ app-> जोड़ें (नया \ स्लिम \ मिडलवेयर \ ContentTypes()); // आने वाले JSON पार्स प्राप्त करें। उसके बाद, GetBody() पार्स किए गए डेटा की एक अच्छी सरणी देता है। –

1

यदि आप जानना चाहते हैं कि "सर्वर पर वास्तव में क्या भेजा जाता है", तो आपको Backbone.sync function in Backbone's code पर एक नज़र रखना चाहिए। यह बहुत अच्छी तरह से प्रलेखित है, चरण-दर-चरण। फिर, आपको जो चाहिए उसे प्राप्त करने का सबसे साफ तरीका है बैकबोन की सिंक से प्रेरित, आपको अपना सिंक फ़ंक्शन लिखना है।

इसके अलावा, सर्वर पर जो भेजा गया है उसे देखने का एक त्वरित तरीका है अपने ब्राउज़र डीबग कंसोल (नेटवर्क टैब) का उपयोग करना। आप यहां तुलना कर सकते हैं बैकबोन बनाम क्या भेजा जाता है जब आप $ .post का उपयोग करते हैं तो क्या भेजा जाता है। अगर आपको और मदद की ज़रूरत है तो कृपया इस जानकारी को पोस्ट करें!

+0

मैं Backbone.sync प्रलेखन पुन: पढ़ने देंगे। मेरी समझ अब तक यह है कि यह पहले से ही एक डिफ़ॉल्ट व्यवहार है, जिसे मैं समझना चाहता हूं! :-) जो मैं समझता हूं, वह मेरे मॉडल विशेषताओं को लेता है और उन्हें जेएसओएन में क्रमबद्ध करता है, इसे भेजता है, और अगर मैं ऑब्जेक्ट में परिवर्तन करता हूं तो सर्वर से वापस आने पर JSON की अपेक्षा करता है। मेरे पोस्ट किए गए उदाहरण का उपयोग करते हुए, जब मैं करता हूं ... bostonCream.save(); मुझे कुछ ऐसा लगता है ... {"name": "बावस्टन क्रेमे", "स्पार्कल्स": सच, "क्रीमफिल्ल्ड": सच} भेजा जाना है। यदि यह सत्य था, तो इसे मेरे उपरोक्त कोड के साथ काम करना चाहिए लेकिन यह नहीं है। संदेह है! कंसोल का उपयोग करने के संबंध में – jmk2142

+0

भी। JQuery के $। पोस्ट के साथ सफलता या विफलता कॉलबैक है जिसे मैं console.log (डेटा) में उपयोग कर सकता हूं। मैं $ _POST गूंज सकता हूं और देख सकता हूं कि कैद किया जा रहा है या नहीं। लेकिन बैकबोन के साथ, मुझे यकीन नहीं है कि मेरी echo $ _POST कैसे देखें। bostonCream.save() अनुरोध भेज देगा और वापस आ जाएगा ... कुछ? क्या कुछ ऐसा लौटाया जा रहा है यह जांचने का सही तरीका होगा? bostonCream.save ({}, {सफलता: फ़ंक्शन (मॉडल, प्रतिक्रिया) {console.log ('सफलता'); console.log (प्रतिक्रिया);}, त्रुटि {console.log ('FAIL'); console.log (प्रतिक्रिया);}}); – jmk2142

+0

क्षमा करें मेरा मतलब है "बैकबोन स्रोत कोड पढ़ें" (मैंने प्रलेखन, मेरी गलती के लिए एक लिंक पोस्ट किया)। Backbone.sync में आप देखेंगे कि क्या होता है। – Blacksad

0

रीढ़ अपने php बैकएंड सर्वर, और आदि

अपने बैकएंड एपीआई डेटाबेस के साथ संवाद स्थापित करने के लिए जिम्मेदार है जो आप अपने RESTful API बेनकाब करना चाहिए मिल की तरह, क्रिया http के लिए प्रतिक्रिया करने के बाद रखा, नष्ट करने के लिए json डेटा भेजता है ।

मुझे एसएलआईएम PHP के बारे में निश्चित नहीं है। ऐसा लगता है कि अनुरोध को संभाला जा रहा है। क्या आप त्रुटि संदेशों को पेस्ट कर सकते हैं?

+0

मैंने उपरोक्त कोड को परीक्षण के बाद कुछ और त्रुटि संदेशों के साथ अद्यतन किया है। मैं कुछ और पढ़ना चाहूंगा जैसे @ब्लैक्सड सुझाव देता है। – jmk2142

संबंधित मुद्दे