Người trợ giúp vs Người mẫu? Tôi nên sử dụng cái nào?


9

Tôi đang làm việc với API Instagram trong magento. Tôi đang tặng phiếu giảm giá cho những người theo dõi instagram của tôi nếu họ theo dõi cửa hàng của chúng tôi trên Instagram.

Tôi đang thực hiện các lệnh gọi API đến instagram bằng PHP bằng cách sử dụng curl. Hiện tại tôi đang gói các lệnh gọi API trong các hàm trợ giúp bên trong mô-đun tùy chỉnh của mình. Thay vào đó tôi có nên gói các cuộc gọi này trong một chức năng bên trong một mô hình không?

Ví dụ. Tôi đang thực hiện cuộc gọi API tới Instagram để xác định xem người dùng hiện tại có đang theo dõi tài khoản của tôi không. Vì vậy, trong bộ điều khiển của tôi, tôi đang thực hiện một cuộc gọi đến chức năng trợ giúp của mình để trả về trạng thái theo dõi cho bộ điều khiển của tôi. Trong bộ điều khiển của tôi, sau đó tôi sẽ cập nhật các mô hình của mình nếu cần thiết.

Tôi có đúng không khi đặt các lệnh gọi API này bên trong các hàm trợ giúp? Khi nào tôi sử dụng người trợ giúp trái ngược với mô hình?

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

}

Câu trả lời:


18

Trước tiên, bạn phải tự hỏi sự khác biệt giữa một mô hình và một người trợ giúp. Câu trả lời phổ biến nhất là "một mô hình có một bảng phía sau nó". Sau đó, hãy tự hỏi mình "tại sao các Quan sát viên được liệt kê là người mẫu chứ không phải người trợ giúp".

Người trợ giúp không nên tồn tại. Nhưng thực tế phổ biến nhất là .. khi bạn không biết đặt mã ở đâu, bạn đặt mã đó vào trình trợ giúp.
Điều này là sai, theo ý kiến ​​của tôi. Sử dụng người trợ giúp không thực sự theo tinh thần OOP. Bạn chỉ đang nhóm một số chức năng độc lập trong một lớp.

Nhưng nói đủ triết lý.
Tôi sẽ sử dụng một mô hình. Chủ yếu là vì người giúp đỡ luôn là người độc thân. Mage::helper()luôn trả về cùng một thể hiện của lớp người trợ giúp.
Đối với các mô hình, bạn có thể nhận được các thể hiện và singletons mới, tùy thuộc vào những gì bạn cần. Vì vậy, nó linh hoạt hơn một chút khi sử dụng một mô hình.

Nhưng trong trường hợp cụ thể này, nếu bạn chỉ cần một thể hiện của lớp, bạn có thể sử dụng một trình trợ giúp hoặc một mô hình. Không có sự khác biệt. Chỉ cần những gì làm cho bạn thoải mái.


Cảm ơn vì điều đó. Khi tôi tạo một lớp mô hình mới sẽ thực hiện các cuộc gọi APi, tôi có cần gia hạn Mage_Core_Model_Abauge hay tôi không cần phải gia hạn bất cứ điều gì?
Alex Lacayo

3
Bạn không cần phải mở rộng mô hình trừu tượng. Nhưng bạn có thể mở rộng Varien_Object. Nó có thể hữu ích nhưng không bắt buộc
Marius

2

Tôi sẽ lập luận rằng nó phù hợp hơn với một mô hình, vì mục đích chính của nó là truy cập và đại diện cho dữ liệu.


2

Mô hình:

echo $MyModel->getUserName();

Người giúp đỡ:

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

Nếu nó có NHÀ NƯỚC NỘI BỘ thì đó là một mô hình. Nếu nó không phải là một người trợ giúp với tất cả các hàm toán học chính xác, như sin(x)hoặc str_tolower($text). Mô hình có trạng thái bên trong Người trợ giúp có trạng thái được tiêm dưới dạng phụ thuộc.


1

Nếu các phương thức được sử dụng bởi nhiều lớp (khối / mô hình / bộ điều khiển) và phổ biến giữa nhiều mô hình, thì một trình trợ giúp là lựa chọn rõ ràng.

Nếu các phương thức chỉ được sử dụng khi một mô hình duy nhất được khởi tạo, thì trong mô hình đó là đúng nơi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.