Aide vs modèle? Que dois-je utiliser?


9

Je travaille avec l'API Instagram dans magento. Je donne des coupons à mes abonnés Instagram s'ils suivent notre boutique sur Instagram.

Je fais des appels API à instagram en PHP en utilisant curl. Actuellement, j'encapsule les appels d'API dans des fonctions d'assistance à l'intérieur de mon module personnalisé. Dois-je plutôt encapsuler ces appels dans une fonction à l'intérieur d'un modèle?

Par exemple. Je fais un appel API à Instagram pour déterminer si l'utilisateur actuel suit mon compte. Donc, dans mon contrôleur, je fais un appel à ma fonction d'assistance qui renvoie l'état de suivi à mon contrôleur. Dans mon contrôleur, je mettrai ensuite à jour mes modèles si nécessaire.

Ai-je raison de placer ces appels d'API dans des fonctions d'assistance? Quand dois-je utiliser des aides par opposition aux modèles?

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

}

Réponses:


18

Vous devez d'abord vous demander quelle est la différence entre un modèle et un assistant. La réponse la plus courante est "un modèle a une table derrière lui". Demandez-vous ensuite "pourquoi les observateurs sont-ils répertoriés comme modèles et non comme aides".

Les aides ne devraient pas exister. Mais la pratique la plus courante est .. quand vous ne savez pas où mettre du code, vous le mettez dans une aide.
C'est faux, à mon avis. Utiliser des aides n'est pas vraiment dans l'esprit de la POO. Vous regroupez simplement des fonctions indépendantes au sein d'une classe.

Mais assez de discours philosophiques.
J'utiliserais un modèle. Principalement parce que les aides sont toujours des singletons. Mage::helper()renvoie toujours la même instance d'une classe d'assistance.
Pour les modèles, vous pouvez obtenir de nouvelles instances et singletons, selon vos besoins. C'est donc un peu plus flexible en utilisant un modèle.

Mais dans ce cas spécifique, si vous n'avez besoin que d'une seule instance de votre classe, vous pouvez utiliser un assistant ou un modèle. Il n'y a pas de différence. Juste ce qui vous rend confortable.


Merci pour cela. Lorsque je crée une nouvelle classe de modèle qui va simplement effectuer des appels APi, dois-je étendre Mage_Core_Model_Abstract ou n'ai-je pas besoin d'étendre quoi que ce soit?
Alex Lacayo

3
Vous n'avez pas besoin d'étendre le modèle abstrait. Mais vous pouvez étendre Varien_Object. Cela pourrait être utile mais pas obligatoire
Marius

2

Je dirais qu'il est plus adapté à un modèle, car son objectif principal est d'accéder aux données et de les représenter.


2

Modèle:

echo $MyModel->getUserName();

Assistant:

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

S'il a un ÉTAT INTERNE, c'est un modèle. Si ce n'est pas le cas, c'est une aide avec toutes les fonctions mathématiques correctes, comme sin(x)ou str_tolower($text). Un modèle a un état interne qu'un Helper obtient est un état injecté en tant que dépendance.


1

Si les méthodes sont utilisées par de nombreuses classes (blocs / modèles / contrôleurs) et communes à plusieurs modèles, alors une aide est le choix évident.

Si les méthodes ne sont utilisées que lorsqu'un seul modèle est instancié, alors au sein de ce modèle se trouve le bon endroit.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.