ตัวช่วยเทียบกับรุ่น? ฉันควรใช้แบบไหน


9

ฉันกำลังทำงานกับ Instagram API ใน magento ฉันให้คูปองแก่ผู้ติดตาม Instagram ของฉันหากพวกเขาติดตามร้านค้าของเราบน Instagram

ฉันกำลังเรียก API ไปยัง instagram ใน 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

ก่อนอื่นคุณต้องถามตัวเองว่าอะไรคือความแตกต่างระหว่างตัวแบบและตัวช่วย คำตอบที่พบบ่อยที่สุดคือ "แบบจำลองมีตารางด้านหลัง" จากนั้นถามตัวเองว่า "ทำไมผู้สังเกตการณ์จึงถูกระบุว่าเป็นแบบจำลองไม่ใช่ผู้ช่วยเหลือ"

ไม่ควรมีผู้ช่วยเหลือ แต่วิธีปฏิบัติที่พบบ่อยที่สุดคือ .. เมื่อคุณไม่รู้ว่าจะใส่รหัสที่ไหนคุณใส่มันเข้าไปในผู้ช่วย
นี่เป็นสิ่งที่ผิดในความคิดของฉัน การใช้ผู้ช่วยเหลือไม่ได้อยู่ในจิตวิญญาณของ OOP คุณเพียงแค่จัดกลุ่มฟังก์ชันอิสระบางอย่างภายในชั้นเรียน

แต่พอพูดถึงปรัชญา
ฉันจะใช้แบบจำลอง สาเหตุหลักมาจากผู้ช่วยเหลือเป็นคนโสดอยู่เสมอ Mage::helper()ส่งคืนอินสแตนซ์เดียวกันของคลาสตัวช่วยเสมอ
สำหรับโมเดลคุณสามารถรับอินสแตนซ์และซิงเกิลใหม่ได้ขึ้นอยู่กับสิ่งที่คุณต้องการ ดังนั้นมันจึงยืดหยุ่นขึ้นเล็กน้อยเมื่อใช้แบบจำลอง

แต่ในกรณีเฉพาะนี้ถ้าคุณต้องการอินสแตนซ์เดียวในชั้นเรียนของคุณคุณสามารถใช้ตัวช่วยหรือแบบจำลองได้ ไม่มีความแตกต่าง สิ่งที่ทำให้คุณรู้สึกสะดวกสบาย


ขอบคุณสำหรับสิ่งนี้. เมื่อฉันสร้างคลาสโมเดลใหม่ที่จะทำการเรียก APi เพียงอย่างเดียวฉันต้องขยาย Mage_Core_Model_Abstract หรือไม่ต้องการขยายอะไร
Alex Lacayo

3
คุณไม่จำเป็นต้องขยายโมเดลนามธรรม แต่คุณสามารถขยาย Varien_Object อาจเป็นประโยชน์ แต่ไม่บังคับ
Marius

2

ฉันจะยืนยันว่ามันเหมาะสมกับโมเดลมากกว่าเนื่องจากวัตถุประสงค์หลักคือการเข้าถึงและแสดงข้อมูล


2

รุ่น:

echo $MyModel->getUserName();

Helper:

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

ถ้ามันมีสถานะเป็นแบบจำลอง ถ้ามันไม่ได้เป็นผู้ช่วยที่มีฟังก์ชั่นที่ถูกต้องทุกทางคณิตศาสตร์เช่นหรือsin(x) str_tolower($text)แบบจำลองมีสถานะภายในที่ผู้ช่วยได้รับสถานะถูกแทรกเข้ามา


1

หากวิธีการใช้หลายคลาส (บล็อก / รุ่น / ตัวควบคุม) และทั่วไประหว่างหลายรุ่นแล้วผู้ช่วยเป็นตัวเลือกที่ชัดเจน

หากวิธีการนั้นเคยถูกใช้เมื่อมีการสร้างอินสแตนซ์เดียวเท่านั้นภายในโมเดลนั้นจะเป็นสถานที่ที่เหมาะสม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.