Helper vs Model? Qual devo usar?

9

Estou trabalhando com a API do Instagram no magento. Estou dando cupons aos meus seguidores do Instagram se eles seguirem nossa loja no Instagram.

Estou fazendo as chamadas de API para o instagram em PHP usando curl. Atualmente, estou agrupando as chamadas da API em funções auxiliares dentro do meu módulo personalizado. Em vez disso, eu deveria agrupar essas chamadas em uma função dentro de um modelo?

Por exemplo. Estou fazendo uma chamada de API para o Instagram para determinar se o usuário atual está seguindo minha conta. Portanto, no meu controlador, estou fazendo uma chamada para minha função auxiliar, que retorna o status a seguir ao meu controlador. No meu controlador, atualizarei meus modelos, se necessário.

Estou correto em colocar essas chamadas de API nas funções auxiliares? Quando uso ajudantes em vez de modelos?

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

Respostas:

18

Primeiro, você deve se perguntar qual é a diferença entre um modelo e um ajudante. A resposta mais comum é "um modelo tem uma tabela por trás". Então pergunte a si mesmo "por que os Observadores estão listados como modelos e não como ajudantes"?

Ajudantes não deveriam existir. Mas a prática mais comum é .. quando você não sabe onde colocar algum código, coloca-o em um ajudante.
Isso está errado, na minha opinião. O uso de ajudantes não faz parte do espírito de POO. Você está apenas agrupando algumas funções independentes dentro de uma classe.

Mas chega de conversa filosófica.
Eu usaria um modelo. Principalmente porque os ajudantes são sempre singletons. Mage::helper()sempre retorna a mesma instância de uma classe auxiliar.
Para modelos, você pode obter novas instâncias e singletons, dependendo do que você precisa. Portanto, é um pouco mais flexível usando um modelo.

Mas neste caso específico, se você precisar apenas de uma instância da sua classe, poderá usar um auxiliar ou um modelo. Não há diferença. Apenas o que faz você se sentir confortável.

Marius
fonte
Obrigado por isso. Quando crio uma nova classe de modelo que simplesmente faz chamadas de APi, preciso estender Mage_Core_Model_Abstract ou não preciso estender nada?
precisa
3
Você não precisa estender o modelo abstrato. Mas você pode estender o Varien_Object. Pode ser útil, mas não obrigatório
Marius
2

Eu argumentaria que é mais adequado a um modelo, pois seu objetivo principal é acessar e representar dados.

Módulos de comércio
fonte
2

Modelo:

echo $MyModel->getUserName();

Ajudante:

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

Se tem um ESTADO INTERNO, é um modelo. Caso contrário, é um auxiliar com todas as funções matemáticas corretas, como sin(x)ou str_tolower($text). Um Modelo tem um estado interno que um Auxiliar recebe um estado injetado como uma dependência.

Roger Keulen
fonte
1

Se os métodos são usados ​​por muitas classes (blocos / modelos / controladores) e comuns entre vários modelos, um auxiliar é a escolha óbvia.

Se os métodos forem usados ​​apenas quando um único modelo for instanciado, nesse modelo será o lugar certo.

choco-loo
fonte