Magento资源和API数据源

时间:2013-01-18 23:12:17

标签: magento

由于我经常使用第三方API,我认为创建一些Magento模块以便轻松连接和查询它们会很有帮助。理想情况下,您可以查询这样的API ......

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

它会为其中一个列表项实例化一个模型,然后通过查询API尝试获取它们的集合。这需要资源模型和API之间的配置中的某种连接,这就是我遇到一些麻烦的地方。

有推荐的方法吗?我很难找到关于这个主题的任何内容,但考虑到通常需要从项目到项目集成的API数量,我觉得它应该是一个非常常见的问题。

1 个答案:

答案 0 :(得分: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模型/收集方法签名进行查询。
  • 实施缓存
  • 在资源模型层中实施API通信