हेल्पर बनाम मॉडल? मुझे कौन सा उपयोग करना चाहिए?


9

मैं Magento में इंस्टाग्राम एपीआई के साथ काम कर रहा हूं। मैं अपने इंस्टाग्राम फॉलोअर्स को कूपन दे रहा हूं अगर वे इंस्टाग्राम पर हमारे स्टोर को फॉलो करते हैं।

मैं कर्ल का उपयोग करके PHP में इंस्टाग्राम पर एपीआई कॉल कर रहा हूं। वर्तमान में मैं अपने कस्टम मॉड्यूल के अंदर सहायक कार्यों में एपीआई कॉल लपेट रहा हूं। क्या मुझे इसके बजाय एक मॉडल के अंदर एक फ़ंक्शन में इन कॉल्स को लपेटना चाहिए?

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

क्या मैं इन एपीआई कॉल को सहायक कार्यों के अंदर डालने में सही हूं? जब मैं मॉडल के विपरीत सहायकों का उपयोग करता हूं?

<?php

class Company_SocialCoupons_InstagramController extends Mage_Core_Controller_Front_Action
{
    public function followAction() {

       $status = Mage::helper('socialcoupons/instagram')->getFollow();

       if ($status == 'follows') {

            // 1. ADD DATA TO MY DATABASE using my custom model
            //    - Ex. Mage::getModel('socialcoupons/instagram')->setInstagramId(*IGID*), etc. 
            // 2. CREATE COUPON
            // 3. EMAIL COUPON TO CUSTOMER
       }
}

class Company_SocialCoupons_Helper_Instagram extends Mage_Core_Helper_Abstract
{

public function getfollow() {

    $accessToken = $this->getAccessToken();
    $relationshipsUrl = 'https://api.instagram.com/v1/users/' . $this->getUserId() . '/relationship?access_token=' . $accessToken;

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $relationshipsUrl);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/json'));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $jsonData = curl_exec($ch);
    curl_close($ch);

    $response = json_decode($jsonData, true);
    $status = $response['data']['outgoing_status'];
    return $status;
}

public function generateAccessToken($code) {

    // exchange code for access token
    $accessTokenUrl = 'https://api.instagram.com/oauth/access_token';
    $data = array(
        'client_id'     => $this->getClientId(),
        'client_secret' => $this->getClientSecret(),
        'code'          => $code,
        'grant_type'    => 'authorization_code',
        'redirect_uri'  => $this->getRedirectUri()
    );       

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $accessTokenUrl);
    curl_setopt($ch, CURLOPT_POST, count($data));
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/json'));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $jsonData = curl_exec($ch);
    curl_close($ch);

    $response = json_decode($jsonData, true);

    if (isset($response['error_type'])) { // no error

        Mage::getSingleton('core/session')->unsInstagramAccessToken();
        Mage::getSingleton('core/session')->addError($response['error_message']);
        return $this->_redirect('*/*/authorize');  
    } 

    $accessToken = $response['access_token'];
    $id          = $response['user']['id'];
    $username    = $response['user']['username'];

    Mage::getSingleton('core/session')->setInstagramAccessToken($accessToken);      

    return array(
        'id'       => $id,
        'username' => $username
    );
}

}

जवाबों:


18

पहले आपको खुद से पूछना चाहिए कि एक मॉडल और सहायक के बीच क्या अंतर है। सबसे आम जवाब "एक मॉडल के पीछे एक मेज है"। फिर अपने आप से पूछें "पर्यवेक्षक मॉडल के रूप में सूचीबद्ध क्यों हैं और सहायक नहीं हैं"।

सहायकों का अस्तित्व नहीं होना चाहिए। लेकिन सबसे आम प्रथा है .. जब आपको पता नहीं होता कि कुछ कोड कहां रखा जाए, तो आप इसे हेल्पर में डाल देंगे।
यह गलत है, मेरी राय में। सहायकों का उपयोग करना वास्तव में OOP भावना में नहीं है। आप बस एक वर्ग के अंदर कुछ स्वतंत्र कार्यों को समूहीकृत कर रहे हैं।

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

लेकिन इस विशिष्ट मामले में, यदि आपको केवल अपने वर्ग के एक उदाहरण की आवश्यकता है तो आप एक सहायक या एक मॉडल का उपयोग कर सकते हैं। इसमें कोई फर्क नही है। बस, जो आपको सहज बनाता है।


इसके लिए धन्यवाद। जब मैं एक नया मॉडल वर्ग बनाता हूं जो केवल एपीआई कॉल करने जा रहा है तो मुझे Mage_Core_Model_Abstract का विस्तार करने की आवश्यकता है या मुझे कुछ भी विस्तारित करने की आवश्यकता नहीं है?
एलेक्स लैकायो

3
आपको सार मॉडल का विस्तार करने की आवश्यकता नहीं है। लेकिन आप Varien_Object का विस्तार कर सकते हैं। यह उपयोगी है, लेकिन अनिवार्य नहीं हो सकता है
मेरियस

2

मैं तर्क दूंगा कि यह एक मॉडल के लिए अधिक अनुकूल है, क्योंकि इसका प्राथमिक उद्देश्य डेटा तक पहुंच और प्रतिनिधित्व है।


2

नमूना:

echo $MyModel->getUserName();

हेल्पर:

echo $MyHelper->getFullname($SomeModelThatImplementsSomeStuff)..

यदि यह एक आंतरिक स्टेट है तो यह एक मॉडल है। यदि ऐसा नहीं है तो यह सभी गणितीय सही कार्यों के साथ सहायक है, जैसे sin(x)या str_tolower($text)। एक मॉडल के पास एक आंतरिक स्थिति है, एक हेल्पर को एक राज्य पर निर्भरता के रूप में इंजेक्शन मिलता है।


1

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

यदि तरीकों का उपयोग केवल तब किया जाता है जब किसी एकल मॉडल को त्वरित किया जाता है, तो उस मॉडल के भीतर सही जगह है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.