ヘルパーvsモデル?どちらを使用すればよいですか?


9

私はmagentoでInstagram APIを使用しています。Instagramで私たちの店をフォローしている場合、私はInstagramフォロワーにクーポンを提供しています。

curlを使用して、PHPでInstagramへのAPI呼び出しを行っています。現在、カスタムモジュール内のヘルパー関数でAPI呼び出しをラップしています。代わりに、これらの呼び出しをモデル内の関数でラップする必要がありますか?

例えば。現在のユーザーが私のアカウントをフォローしているかどうかを確認するために、InstagramへのAPI呼び出しを行っています。それで、私のコントローラーでは、コントローラーにfollowステータスを返すヘルパー関数を呼び出しています。コントローラで、必要に応じてモデルを更新します。

これらの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

最初に、モデルとヘルパーの違いは何かを自問する必要があります。最も一般的な答えは、「モデルの背後にテーブルがある」です。次に、「なぜオブザーバーがヘルパーではなくモデルとしてリストされているのか」と自問してください。

ヘルパーは存在すべきではありません。ただし、最も一般的な方法は、コードの配置場所がわからない場合は、ヘルパーに配置することです。
私の意見では、これは間違っています。ヘルパーを使用することは、実際にはOOPの精神ではありません。クラス内のいくつかの独立した関数をグループ化しているだけです。

しかし、十分な哲学の話。
モデルを使用します。主にヘルパーは常にシングルトンだからです。Mage::helper()常にヘルパークラスの同じインスタンスを返します。
モデルの場合、必要に応じて、新しいインスタンスとシングルトンを取得できます。そのため、モデルを使用すると少し柔軟になります。

ただし、この特定のケースでは、クラスのインスタンスが1つだけ必要な場合は、ヘルパーまたはモデルを使用できます。違いはありません。何があなたを快適にするか。


これをありがとう。単純にAPi呼び出しを行う新しいモデルクラスを作成する場合、Mage_Core_Model_Abstractを拡張する必要がありますか、それとも何も拡張する必要はありませんか?
Alex Lacayo 2014年

3
抽象モデルを拡張する必要はありません。しかし、Varien_Objectを拡張できます。便利かもしれませんが必須ではありません
マリウス


2

モデル:

echo $MyModel->getUserName();

ヘルパー:

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

それが内部状態を持っている場合、それはモデルです。そうでない場合、それはのように、すべての数学の正しい機能を持つヘルパーのですsin(x)str_tolower($text)。モデルには、ヘルパーが依存関係として挿入された状態の内部状態があります。


1

メソッドが多くのクラス(ブロック/モデル/コントローラー)で使用され、複数のモデル間で共通である場合、ヘルパーは当然の選択です。

単一のモデルがインスタンス化されるときにのみメソッドが使用される場合、そのモデル内が適切な場所です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.