도우미 대 모델? 어느 것을 사용해야합니까?


9

magento에서 Instagram API로 작업하고 있습니다. 인스 타 그램에서 우리 매장을 따라 가면 인스 타 그램 팔로어에게 쿠폰을주고 있습니다.

curl을 사용하여 PHP에서 인스 타 그램에 대한 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
    );
}

}

답변:


18

먼저 모델과 도우미의 차이점이 무엇인지 자문해야합니다. 가장 일반적인 대답은 "모델 뒤에 테이블이 있습니다"입니다. 그런 다음 자신에게 "관찰자가 왜 모델이 아닌 도우미로 나열되어 있습니까?"

도우미는 존재하지 않아야합니다. 그러나 가장 일반적인 관행은 .. 코드를 어디에 넣을지 모른다면 도우미에 넣는 것입니다.
제 생각에는 이것은 잘못된 것입니다. 헬퍼를 사용하는 것이 실제로 OOP 정신이 아닙니다. 클래스 내에서 일부 독립 함수를 그룹화하고 있습니다.

그러나 충분한 철학적 이야기.
모델을 사용하겠습니다. 도우미는 항상 싱글 톤이기 때문에 주로. Mage::helper()항상 도우미 클래스의 동일한 인스턴스를 반환합니다.
모델의 경우 필요한 것에 따라 새 인스턴스와 싱글 톤을 얻을 수 있습니다. 따라서 모델을 사용하면 약간 더 유연합니다.

그러나이 특정 경우 클래스의 인스턴스가 하나만 필요한 경우 도우미 또는 모델을 사용할 수 있습니다. 다른 점이 없다. 당신을 편안하게 만드는 것.


고마워 단순히 APi 호출을 할 새 모델 클래스를 만들 때 Mage_Core_Model_Abstract를 확장해야합니까, 아니면 아무것도 확장 할 필요가 없습니까?
Alex Lacayo 1

3
추상 모델을 확장 할 필요는 없습니다. 그러나 Varien_Object를 확장 할 수 있습니다. 유용하지만 필수는 아닙니다.
Marius

2

기본 목적은 데이터에 액세스하고 표현하는 것이기 때문에 모델에 더 적합하다고 주장합니다.


2

모델:

echo $MyModel->getUserName();

돕는 사람:

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

내부 상태가 있으면 모델입니다. 그렇지 않은 경우는, 모든 수학 올바른 기능을 가진 헬퍼의 같은 sin(x)str_tolower($text). 모델에는 도우미가 의존성으로 주입 된 상태를 얻는 내부 상태가 있습니다.


1

메소드가 많은 클래스 (블록 / 모델 / 컨트롤러)에서 사용되고 여러 모델간에 공통 인 경우, 도우미가 확실한 선택입니다.

단일 모델이 인스턴스화 될 때만 메소드를 사용하는 경우 해당 모델 내에서 올바른 위치를 선택하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.