助手与模型?我应该使用哪个?


9

我正在使用magento中的Instagram API。如果他们在Instagram上关注我们的商店,我会为instagram的关注者提供优惠券。

我正在使用curl使用PHP对instagram进行API调用。目前,我将API调用包装在自定义模块中的辅助函数中。我是否应该将这些调用包装在模型中的函数中?

例如。我正在对Instagram进行API调用,以确定当前用户是否关注我的帐户。因此,在控制器中,我正在调用助手函数,该函数将关注状态返回给控制器。然后在我的控制器中,如有必要,我将更新我的模型。

将这些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
    );
}

}

Answers:


18

首先,您必须问自己一个模型和一个助手之间的区别是什么。最常见的答案是“模型后面有表格”。然后问自己“为什么观察者被列为模型而不是帮助者”。

助手不应该存在。但是最常见的做法是..当您不知道将代码放在哪里时,可以将其放在帮助程序中。
我认为这是错误的。在OOP精神中并不是真正使用助手。您只是将一些独立的函数分组在一个类中。

但是有足够的哲学话语。
我会用一个模型。主要是因为助手总是单身。Mage::helper()总是返回助手类的相同实例。
对于模型,您可以根据需要获得新的实例和单例。因此使用模型更加灵活。

但是在这种特定情况下,如果您只需要一个类的实例,则可以使用助手或模型。没有区别。正是什么让您感到舒适。


谢谢你 当我创建一个仅用于进行APi调用的新模型类时,是否需要扩展Mage_Core_Model_Abstract或不需要扩展任何内容?
Alex Lacayo 2014年

3
您不需要扩展抽象模型。但是您可以扩展Varien_Object。它可能有用但非强制性
Marius

2

我认为它更适合模型,因为它的主要目的是访问和表示数据。


2

模型:

echo $MyModel->getUserName();

帮手:

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

如果它具有内部状态,则为模型。如果不是,那么它是所有数学正确函数(例如sin(x)或)的帮助者str_tolower($text)。一个模型有一个内部状态,助手得到的状态作为依赖注入。


1

如果这些方法由许多类(块/模型/控制器)使用并且在多个模型之间通用,那么辅助方法是显而易见的选择。

如果仅在实例化单个模型时才使用这些方法,则在该模型内是正确的位置。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.