Помічник проти моделі? Який я повинен використовувати?


9

Я працюю з API Instagram в Магенто. Я дарую купони своїм підписникам в Інстаграм, якщо вони слідкують за нашим магазином в Instagram.

Я здійснюю виклики API для інстаграм у PHP за допомогою curl. В даний час я завертую виклики API у функції помічників всередині мого спеціального модуля. Чи потрібно замість цього перетворювати ці дзвінки у функцію всередині моделі?

Наприклад. Я здійснюю дзвінок API в Instagram, щоб визначити, чи слідкує за моїм обліковим записом поточний користувач. Отже, у своєму контролері я телефоную на свою допоміжну функцію, яка повертає наступний стан моєму контролеру. Потім у своєму контролері я оновлюю свої моделі, якщо потрібно.

Чи правильно я вкладаю ці виклики API у допоміжні функції? Коли я використовую помічники на відміну від моделей?

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

}

Відповіді:


18

Спочатку ви повинні запитати себе, в чому різниця між моделлю та помічником. Найпоширеніша відповідь - «модель має за собою стіл». Тоді запитайте себе, "чому спостерігачі вказані як моделі, а не помічники".

Помічники не повинні існувати. Але найпоширеніша практика - це коли ви не знаєте, куди поставити якийсь код, кладете його в помічник.
На мою думку, це неправильно. Використання помічників насправді не в дусі ООП. Ви просто групуєте деякі незалежні функції всередині класу.

Але досить філософських розмов.
Я б використав модель. Головним чином, тому що помічники - це завжди одинокі. Mage::helper()завжди повертає той самий екземпляр класу помічників.
Для моделей ви можете отримати нові екземпляри та одиночні кнопки, залежно від того, що вам потрібно. Тож за допомогою моделі трохи гнучкіше.

Але в цьому конкретному випадку, якщо вам потрібен лише один екземпляр вашого класу, ви можете використовувати або помічник, або модель. Різниці немає. Тільки те, що робить тебе комфортним.


Дякую за це Коли я створюю новий клас моделі, який просто робитиме дзвінки APi, чи потрібно мені продовжувати Mage_Core_Model_Ab абстракт чи мені нічого не потрібно продовжувати?
Алекс Лакайо

3
Вам не потрібно розширювати абстрактну модель. Але ви можете розширити Varien_Object. Це може бути корисним, але не обов’язковим
Маріус

2

Я заперечую, що вона більше підходить до моделі, оскільки її основною метою є доступ та представлення даних.


2

Модель:

echo $MyModel->getUserName();

Помічник:

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

Якщо він має ВНУТРІШНІЙ ДЕРЖАВ, це модель. Якщо це не так, це помічник з усіма правильними математичними функціями, наприклад, sin(x)або str_tolower($text). Модель має внутрішній стан. Помічник отримує стан, який вводиться як залежність.


1

Якщо методи використовуються багатьма класами (блоками / моделями / контролерами) і загальні між декількома моделями, то очевидним вибором є помічник.

Якщо методи коли-небудь застосовуються лише тоді, коли одна модель є екземпляром, то всередині цієї моделі є правильне місце.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.