Helper vs Model? Yang mana yang harus saya gunakan?

9

Saya bekerja dengan API Instagram di magento. Saya memberikan kupon kepada pengikut instagram saya jika mereka mengikuti toko kami di Instagram.

Saya membuat panggilan API ke instagram di PHP menggunakan curl. Saat ini saya sedang membungkus panggilan API dalam fungsi pembantu di dalam modul khusus saya. Haruskah saya membungkus panggilan ini dalam suatu fungsi di dalam model?

Sebagai contoh. Saya membuat panggilan API ke Instagram untuk menentukan apakah pengguna saat ini mengikuti akun saya. Jadi, di controller saya, saya membuat panggilan ke fungsi helper saya yang mengembalikan status follow ke controller saya. Di controller saya, saya kemudian akan memperbarui model saya jika perlu.

Apakah saya benar menempatkan panggilan API ini di dalam fungsi pembantu? Kapan saya menggunakan pembantu dibandingkan dengan model?

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

}

Alex Lacayo
sumber

Jawaban:

18

Pertama, Anda harus bertanya pada diri sendiri apa perbedaan antara model dan pembantu. Jawaban paling umum adalah "seorang model memiliki tabel di belakangnya". Kemudian tanyakan pada diri sendiri "mengapa Pengamat terdaftar sebagai model dan bukan pembantu".

Pembantu seharusnya tidak ada. Tetapi praktik yang paling umum adalah .. ketika Anda tidak tahu di mana harus meletakkan beberapa kode, Anda memasukkannya ke dalam helper.
Ini salah, menurut saya. Menggunakan pembantu tidak benar-benar dalam semangat OOP. Anda hanya mengelompokkan beberapa fungsi independen di dalam kelas.

Tapi pembicaraan filosofis cukup.
Saya akan menggunakan model. Terutama karena pembantu selalu lajang. Mage::helper()selalu mengembalikan instance yang sama dari kelas pembantu.
Untuk model, Anda bisa mendapatkan instance dan lajang baru, tergantung pada apa yang Anda butuhkan. Jadi sedikit lebih fleksibel menggunakan model.

Tetapi dalam kasus khusus ini, jika Anda hanya membutuhkan satu instance kelas Anda, Anda dapat menggunakan helper atau model. Tidak ada perbedaan. Apa yang membuat Anda nyaman.

Marius
sumber
Terima kasih untuk ini. Ketika saya membuat kelas model baru yang hanya akan membuat panggilan APi apakah saya perlu memperpanjang Mage_Core_Model_Abstract atau apakah saya tidak perlu memperpanjang apa pun?
Alex Lacayo
3
Anda tidak perlu memperpanjang model abstrak. Tetapi Anda dapat memperluas Varien_Object. Mungkin bermanfaat tetapi tidak wajib
Marius
2

Saya berpendapat bahwa itu lebih cocok untuk model, karena tujuan utamanya adalah mengakses dan mewakili data.

Modul Perdagangan
sumber
2

Model:

echo $MyModel->getUserName();

Pembantu:

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

Jika memiliki NEGARA INTERNAL itu adalah model. Jika tidak, ini membantu dengan semua fungsi matematika yang benar, seperti sin(x)atau str_tolower($text). Model memiliki status internal yang bisa diterima oleh Pembantu sebagai kondisi ketergantungan.

Roger Keulen
sumber
1

Jika metode ini digunakan oleh banyak kelas (blok / model / pengontrol) dan umum di antara banyak model, maka helper adalah pilihan yang jelas.

Jika metode hanya pernah digunakan ketika model tunggal dipakai, maka di dalam model itu adalah tempat yang tepat.

choco-loo
sumber