2013-01-18 37 views
2

由於我經常使用第三方API,我認爲創建一些Magento模塊以實現輕鬆連接和查詢會很有幫助。理想情況下,你可以查詢像這樣的API ...Magento資源和API數據源

$data = Mage::getModel('tools/apixyz_list')->getCollection(); 

它將實例列表項的一個模型,然後試圖通過查詢API來獲取他們的集合。這需要在資源模型和API之間的配置中進行某種連接,這就是我遇到一些麻煩的地方。

有沒有推薦的方法來做到這一點?我在尋找關於這個主題的任何東西時遇到了很多困難,但考慮到通常需要從項目集成到項目中的API數量,我覺得它應該是一個相當普遍的問題。

+2

不,這樣做的沒有建議的方式API通信。所有第三方API審訊都避開了Magento模型系統,並自行推出了一些東西,而第一方API集成使用更專業的模型格式(支付,運輸等)。你最初的感覺可能是「它應該已經存在,因爲它是一個普遍問題」,但是對於你的第二種感覺,那就是「某人應該已經建立了這個」。其他人都以同樣的方式感受,所以它永遠不會建成。 –

回答

3

是的!我實際上是爲Recurly構建的 - 我試圖讓它開源,但尚未打開。下面是load()方法的一個片段,它是它的內核。

// TBT_Recurly_Model_Resource_Recurly_Abstract_Collection 
public function load($printQuery = false, $logQuery = false) 
{ 
    if ($this->isLoaded()) { 
     return $this; 
    } 

    if ($this->_isCached()) { 
     return $this->_loadCache(); 
    } 

    $this->_beforeLoad(); 
    $this->_renderFilters() 
     ->_renderOrders() 
     ->_renderLimit(); 
    $this->clear(); 

    try { 
     # This is ultimately doing the API call 
     $recurly_list = $this->_getListSafe(); 
    } catch (Recurly_Error $e) { 
     Mage::logException($e); 
     $this->setConnectionError($e->getMessage()); 
     return $this; 
    } 

    foreach ($recurly_list as $recurly_item) 
    { 
     $item = $this->getNewEmptyItem(); 
     $item->getResource()->setDataOnObject($item, $recurly_item); 

     // Recurly appears to sometimes return duplicate subscription items in it's list response. 
     if (!isset($this->_items[$item->getId()])) { 
      $this->addItem($item); 
     } 
    } 
    $this->_afterLoadRecurly(); 

    // We have to setIsLoaded before we saveCache b/c otherwise it will infinite loop 
    $this->_setIsLoaded(); 
    $this->_saveCache(); 
    $this->_afterLoad(); 
    return $this; 
} 

實際上,我們最終採取這一點,並把它變成一個基地REST類,這是真的很酷,因爲它結束了是很容易實現在它之上的新的REST API。

就最佳實踐而言,我不確定我是否專門回答了您的問題。但基本上我認爲要做到這一點的主要工作是:

  • 請按照Magento模型/收集方法簽名進行查詢。
  • 實現緩存
  • 實現在資源模型層
+0

我發現讓這種類型的操作能夠工作的唯一方法是完全繞過資源層。即使在它的基礎上,「Mage_Core_Model_Resource_Abstract」仍然專門用於數據庫的使用,它會嘗試連接到配置中指定的數據庫表。 – wlvrn

+0

Mage絕對是針對數據庫的,但是我必須把它交給他們,他們需要將這些數據抽象到數據庫之外。我實際上直接在我的資源集合中擴展Varien_Data_Collection。我確實在資源模型中擴展了Mage_Core_Model_Resource_Abstract。 – kalenjordan