2

私はサードパーティの API を頻繁に使用するので、Magento モジュールをいくつか作成して、簡単に接続してクエリを実行できるようにすると便利だと思いました。理想的には、次のような API を照会できます...

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

リスト項目の 1 つのモデルをインスタンス化し、API にクエリを実行してそれらのコレクションを取得しようとします。これには、リソース モデルと API の間の構成で何らかの接続が必要になりますが、ここで少し問題が発生します。

これを行うための推奨される方法はありますか? この件について何かを見つけるのは非常に困難ですが、一般的にプロジェクトからプロジェクトへと統合する必要がある API の量を考えると、これはかなり一般的な問題であるべきだと思います。

4

1 に答える 1

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 通信を実装する
于 2013-01-19T00:29:24.977 に答える