Yardımcı mı Model mi? Hangisini kullanmalıyım?


9

Magento'daki Instagram API ile çalışıyorum. Instagram'daki mağazamızı takip ederlerse instagram takipçilerime kupon veriyorum.

Ben curl kullanarak PHP instagram API çağrıları yapıyorum. Şu anda API modülümün özel modülümün içindeki yardımcı işlevlere geçiyorum. Bunun yerine bu çağrıları bir model içindeki bir işleve mi sarmalıyım?

Örneğin. Mevcut kullanıcının hesabımı takip edip etmediğini belirlemek için Instagram'a bir API çağrısı yapıyorum. Denetleyicimde, takip işlevini denetleyicime döndüren yardımcı işlevime bir çağrı yapıyorum. Denetleyicimde, gerekirse modellerimi güncelleyeceğim.

Bu API çağrılarını yardımcı işlevlerin içine yerleştirmekte doğru muyum? Modellerin aksine yardımcıları ne zaman kullanırım?

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

}

Yanıtlar:


18

Öncelikle kendinize bir model ve bir yardımcı arasındaki farkın ne olduğunu sormalısınız. En yaygın cevap "bir modelin arkasında bir tablo var" dır. O zaman kendinize "Gözlemciler neden yardımcı olarak değil model olarak listeleniyor" diye sorun.

Yardımcılar olmamalıdır. Ama en yaygın uygulama, nerede kod koyacağınızı bilmediğinizde, bunu bir yardımcıya koyarsınız.
Bence bu yanlış. Yardımcıları kullanmak gerçekten OOP ruhunda değildir. Bir sınıf içindeki bazı bağımsız işlevleri gruplandırıyorsunuz.

Ama yeterince felsefi konuşma.
Bir model kullanırdım. Temel olarak yardımcılar her zaman tekil olduğu için. Mage::helper()her zaman bir yardımcı sınıfın aynı örneğini döndürür.
Modeller için, ihtiyacınız olan şeye bağlı olarak yeni örnekler ve tek tonlar alabilirsiniz. Yani bir model kullanmak biraz daha esnektir.

Ancak bu özel durumda, sınıfınızın yalnızca bir örneğine ihtiyacınız varsa bir yardımcı veya bir model kullanabilirsiniz. Fark yok. Sizi rahat ettiren şey.


Bunun için teşekkürler. APi çağrıları yapacak yeni bir model sınıfı oluşturduğumda Mage_Core_Model_Abstract'ı genişletmem gerekiyor mu yoksa hiçbir şeyi genişletmem gerekmiyor mu?
Alex Lacayo

3
Soyut modeli genişletmenize gerek yoktur. Ancak Varien_Object öğesini genişletebilirsiniz. Yararlı olabilir ancak zorunlu olmayabilir
Marius

2

Temel amacı verilere erişmek ve bu verileri temsil etmek olduğundan, bir modele daha uygun olduğunu iddia ediyorum.


2

Model:

echo $MyModel->getUserName();

Yardımcı:

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

DAHİLİ DEVLET varsa, bu bir modeldir. Yoksa, sin(x)veya gibi tüm matematiksel doğru işlevlere sahip bir yardımcıdır str_tolower($text). Bir Modelin dahili bir durumu vardır.


1

Yöntemler birçok sınıf (blok / model / denetleyici) tarafından kullanılıyorsa ve birden çok model arasında ortaksa, yardımcı bir seçenektir.

Yöntemler yalnızca tek bir model başlatıldığında kullanılırsa, bu model içinde doğru yer olur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.