Helfer gegen Modell? Welches soll ich verwenden?

9

Ich arbeite mit der Instagram-API in Magento. Ich gebe meinen Instagram-Followern Gutscheine, wenn sie unserem Shop auf Instagram folgen.

Ich mache die API-Aufrufe von Instagram in PHP mit Curl. Derzeit verpacke ich die API-Aufrufe in Hilfsfunktionen in meinem benutzerdefinierten Modul. Sollte ich diese Aufrufe stattdessen in eine Funktion innerhalb eines Modells einschließen?

Zum Beispiel. Ich rufe Instagram bei einer API auf, um festzustellen, ob der aktuelle Benutzer meinem Konto folgt. In meinem Controller rufe ich meine Hilfsfunktion auf, die den Folgestatus an meinen Controller zurückgibt. In meinem Controller werde ich dann bei Bedarf meine Modelle aktualisieren.

Bin ich richtig darin, diese API-Aufrufe in Hilfsfunktionen einzufügen? Wann benutze ich Helfer im Gegensatz zu Modellen?

<?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
quelle

Antworten:

18

Zuerst müssen Sie sich fragen, was der Unterschied zwischen einem Modell und einem Helfer ist. Die häufigste Antwort lautet "Ein Modell hat einen Tisch dahinter". Dann fragen Sie sich, warum Beobachter als Modelle und nicht als Helfer aufgeführt sind.

Helfer sollten nicht existieren. Aber die gängigste Praxis ist ... Wenn Sie nicht wissen, wo Sie Code einfügen sollen, geben Sie ihn in einen Helfer ein.
Das ist meiner Meinung nach falsch. Die Verwendung von Helfern ist nicht wirklich im Sinne von OOP. Sie gruppieren nur einige unabhängige Funktionen innerhalb einer Klasse.

Aber genug philosophisches Gerede.
Ich würde ein Modell verwenden. Hauptsächlich, weil Helfer immer Singletons sind. Mage::helper()Gibt immer dieselbe Instanz einer Hilfsklasse zurück.
Für Modelle können Sie je nach Bedarf neue Instanzen und Singletons erhalten. Mit einem Modell ist es also etwas flexibler.

In diesem speziellen Fall können Sie jedoch entweder einen Helfer oder ein Modell verwenden, wenn Sie nur eine Instanz Ihrer Klasse benötigen. Es gibt keinen Unterschied. Genau das, was Sie bequem macht.

Marius
quelle
Danke dafür. Muss ich beim Erstellen einer neuen Modellklasse, die einfach APi-Aufrufe ausführt, Mage_Core_Model_Abstract erweitern oder muss ich nichts erweitern?
Alex Lacayo
3
Sie müssen das abstrakte Modell nicht erweitern. Sie können Varien_Object jedoch erweitern. Es könnte nützlich sein, aber nicht obligatorisch
Marius
2

Ich würde argumentieren, dass es besser für ein Modell geeignet ist, da sein Hauptzweck darin besteht, auf Daten zuzugreifen und diese darzustellen.

Handelsmodule
quelle
2

Modell:

echo $MyModel->getUserName();

Helfer:

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

Wenn es einen INTERNEN STAAT hat, ist es ein Modell. Wenn dies nicht der Fall ist, ist es ein Helfer mit allen mathematisch korrekten Funktionen wie sin(x)oder str_tolower($text). Ein Modell hat einen internen Zustand, den ein Helfer als Abhängigkeit erhält.

Roger Keulen
quelle
1

Wenn die Methoden von vielen Klassen (Blöcken / Modellen / Controllern) verwendet werden und mehreren Modellen gemeinsam sind, ist ein Helfer die naheliegende Wahl.

Wenn die Methoden immer nur verwendet werden, wenn ein einzelnes Modell instanziiert wird, ist innerhalb dieses Modells der richtige Ort.

Schoko-Klo
quelle