2011-08-30 8 views
6

मैं समझता हूं कि व्यवहार मॉडल का विस्तार करना और इसमें कार्यक्षमता जोड़ना है, लेकिन ज्यादातर मामलों में वसा-मॉडल विचार व्यवहार को बेकार बना रहा है, है ना?केकफ़्पी - मॉडल और व्यवहार के बीच क्या अंतर है?

और, भले को प्राथमिकता दी है, मेरे पहले पैराग्राफ पर ध्यान न दें और बस का जवाब - कृपया - शीर्षक में सवाल है, और यह स्पष्ट करना

धन्यवाद

उत्तर

22

एक व्यवहार यहीं आप कोड है कि वास्तव में एक विशिष्ट मॉडल डोमेन संबंधित नहीं है निकालें। जैसे, सहायक कार्य, या एक मिश्रण/मॉड्यूल (यदि आप अन्य प्रोग्रामिंग भाषाओं से उस पैटर्न से परिचित हैं)।

यदि आप केकेपीएचपी हेल्पर्स और घटकों से परिचित हैं, तो आप इसे इस तरह देख सकते हैं। मॉडल के रूप में एक मॉडल है क्योंकि हेल्पर को घटक के रूप में देखना है नियंत्रक के लिए है। असल में कार्यक्षमता का एक सेट जो कई मॉडलों में उपयोग किया जाएगा।

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

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

// models/behaviors/soft_deletable.php 
class SoftDeletableBehavior extends ModelBehavior { 
    function setup(&$Model, $settings = array()) { 
     // do any setup here 
    } 

    // override the delete function (behavior methods that override model methods take precedence) 
    function delete(&$Model, $id = null) { 
     $Model->id = $id; 

     // save the deleted field with current date-time 
     if ($Model->saveField('deleted', date('Y-m-d H:i:s'))) { 
      return true; 
     } 

     return false; 
    } 

    function beforeFind(&$Model, $query) { 
     // only include records that have null deleted columns 
     $query['conditions']["{$Model->alias}.deleted <>"] = ''; 
     return $query; 
    } 
} 
अपने मॉडल

Class User extends AppModel { 
    public $actsAs = array('SoftDeletable'); 
} 

में और अपने नियंत्रक से

उसके बाद, आप अपने मॉडल

Class UsersControllers extends AppController { 
    function someFunction() { 
     $this->User->delete(1); // soft deletes user with id of 1 

     $this->User->find('all'); // this will not exclude user with an id of 1 
    } 
} 

मुझे आशा है कि इस मदद करता है पर हमारे व्यवहार के तरीकों के सभी कॉल कर सकते हैं।

+0

शानदार उत्तर! बहुत पठनीय और समझने योग्य कोड उदाहरण! धन्यवाद। – yossi

+0

आपका स्वागत है योसी। मैं उम्मीद कर रहा था कि यह बहुत लंबा नहीं था! –

+0

नहीं, यह सही था .. यही कारण है कि .. क्या आप इसे जांच सकते हैं? http://stackoverflow.com/questions/7278357/cakephp-creating-new-user-account-several-problems/7278402#7278402 – yossi

3

व्यवहार मॉडल के बीच साझा किया जा सकता है एक उदाहरण जोड़ें। आम तौर पर एक व्यवहार में अमूर्त कोड होता है जिसे पर मॉडल पर लागू किया जा सकता है।

जबकि आप निश्चित रूप से इसे एक मॉडल के लिए लिख सकते हैं, तो आपको इसे किसी अन्य मॉडल के लिए फिर से लिखना होगा। इसे साझा करने के लिए सारण करके, आपने व्यवहार बनाया है।

CakePHP में एक व्यवहार एक मॉडल करने के लिए एक नियंत्रक करने के लिए एक घटक रूप में एक ही रिश्ते या एक हेल्पर एक देखें है।

केकेपीएचपी में कोर व्यवहार का एक उदाहरण Containable है। यह आपको find() द्वारा उपयोग किए गए रिश्तों पर बेहतर नियंत्रण करने की अनुमति देता है।

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