कोहाना का ओआरएम बिल्ट इन कोहाना वैलिडेशन के साथ आता है।

जितना मैंने समझा, यह उन फ़ील्ड्स को मान्य करता है जिन्हें होगा जोड़ा जाएगा डेटाबेस। यह मेरे लिए काम नहीं करेगा क्योंकि मुझे फ़ील्ड सत्यापित करने की आवश्यकता है जो $_POST (साधारण शब्दों में) से आते हैं।

मैं आपको एक उदाहरण देता हूं।

नियंत्रक में:

$data = Arr::extract($this->request->post(), array('username', 'password', 'password_repeatedly', 'email'));

try {

   ORM::factory('User')->sign_up($data);

   $this->request->redirect('sign-in');

} catch(ORM_Validation_Exception $exception) {

   $errors = $exception->errors('error_messages');

   echo 'There were errors:<br />';
   echo Debug::dump($errors);

   exit;

}

परिवर्तनीय $data वह सरणी है जिसे मुझे सत्यापित करने की आवश्यकता है। विधि sign_up() है मेरे ओआरएम मॉडल में बस कस्टम विधि जो उपयोगकर्ता बनाएगी। के बारे में खेद नियंत्रक में "echo'es" और "exit's" - मैं बस डिबगिंग कर रहा हूं ...

मेरा ओआरएम मॉडल इस तरह दिखता है:

public function rules() {

   return array(
           'username' => array(
                   array('not_empty')
           ),
           'hashed_password' => array(
                   array('not_empty')
           ),
           'email' => array(
                   array('not_empty')
           )
   );

}

public function sign_up($post) {

   $salt            = $this->_hurricane->generate_salt();
   $hashed_password =
   $this->_hurricane->hash_password($post['password'], $salt);

   $this->username        = $post['username'];
   $this->hashed_password = $hashed_password;
   $this->salt            = $salt;
   $this->email           = $post['email'];

   $this->save();

}

मैं जांचना चाहता हूं कि वेरिएबल $data के वे तीन तत्व हैं नहीं खाली! जैसा कि मैंने कहा, यह ORM::save() is . से पहले तत्वों की जांच करता है बुलाया। और अगर ypu मेरे कोड को करीब से देखता है ... मेरी कस्टम विधि में I कुछ होने के लिए hashed_password सेट किया है। यह इसे हैश बना देगा। समस्या यह है कि यदि उपयोगकर्ता ने कोई पासवर्ड सबमिट नहीं किया है (मैं उसे कॉल करता हूं मेरे एचटीएमएल फॉर्म में फ़ील्ड 'पासवर्ड', लेकिन 'हैशेड_पासवर्ड' में डेटाबेस)... यदि कोई पासवर्ड सबमिट नहीं किया गया है - यह खाली स्ट्रिंग हैश करेगा जो वैसे भी हैश की ओर ले जाएगा। तो hashed_password सेट हो गया है!

फिर सत्यापन को ORM::save() द्वारा चालू किया जाता है और निष्कर्ष में - पासवर्ड कभी भी खाली नहीं हो सकता! इससे कैसे निपटें? अतिरिक्त नियंत्रक में सत्यापन? आप इससे कैसे निपटेंगे? शायद थोड़ा सा थोड़ा अलग तर्क?

पी.एस. मेरे कोड के लिए कोई अन्य सुझाव की सराहना की जाएगी। सलाह में धन्यवाद!

0
daGrevis 11 जुलाई 2011, 00:20

1 उत्तर

सबसे बढ़िया उत्तर

मैं नहीं देखता कि आपकी वर्तमान पद्धति में 'गलत' क्या है।

आप यह जांचने के लिए एक शर्त (Model_user::signup()) जोड़ सकते हैं कि अनुरोध किया गया पासवर्ड हैशिंग से पहले खाली है या नहीं (ofc, अगर यह है तो इसे बिल्कुल भी सेट नहीं कर रहा है), इसलिए यह खाली रहेगा और सत्यापन विफल हो जाएगा।

एक और बात जो मैं यहां देख सकता हूं, वह यह है कि साइनअप विधि अपने आप में अस्पष्ट है, इसे पासवर्ड के लिए एक फिल्टर के साथ संयुक्त रूप से सामान्य create() का उपयोग करके आसानी से किया जा सकता है (ताकि हैशेड_पासवर्ड और नमक बदलने पर सेट हो जाए)।

इम्हो वर्तमान वस्तुओं की स्थिति के आधार पर सशर्त नियमों/फ़िल्टरों का उपयोग करना भी एक अच्छा अभ्यास है।

0
Kemo 11 जुलाई 2011, 12:30