2017-01-28 9 views
0

私は2つのAPIからいくつかの製品情報を得ています(3つ目のAPIを追加しようと考えています)。Yii2 - 異なるAPIでモデルを処理する最も良い方法

 
interface ProductInterface 
{ 
    public function getId(); 

    public function getSku(); 

    /** @return GalleryImageInterface[] */ 
    public function getImages(); 

    ... 
} 
 
interface GalleryImageInterface 
{ 
    public function getId(); 

    public function getUrl(); 

    ... 
} 

目標は、これらのインタフェースを実装する製品のリストを作成するための正しい方法で、APIのデータを処理することです:私のアプリは、このように(メインアプリに実装される)インタフェースが含まれているモジュールがあります。私が見つけた最も簡単な方法は、フロントエンドコントローラーjson_decode()でAPIのjsonデータを取得し、それらの配列をモジュールのモデルにマップし、マッピングする方法です。 しかし、APIからいくつかの追加フィールドを追加したり、別のAPIをソースとして追加したい場合は、ほとんど役に立たないようです。

経験豊富なYii2開発者からいくつかのヒントを得ることに非常に感謝します。

答えて

0

インターフェイスではなく、モデルを使用して大量の割り当てから利点を得ます。 次に、これらの属性を静的メソッドで取得します。そのため、データをインポートする際に固有のアクセスポイントがあります。

Productクラス

use yii\base\Model; 
class Product extends Model 
{ 
     $id; 
     $sku; 
     $images; 

     public static parseFromItemArray($ia) { 
      $obj = new self(); 
      $obj->attributes = $ia; 
      $obj->images = GalleryImage::parseFromListArray($ia['images']; 

      return $obj; 
     } 

     public static parseFromListArray($la) { 
      $output = []; 
      foreach($la as $li) 
      { 
       $output[] = self::parseFromItemArray($ia); 
      } 
      return $output; 
     }   
} 

GalleryImageクラス

use yii\base\Model; 
class GalleryImage extends Model 
{ 
     $id; 
     $url; 

     public static parseFromItemArray($ia) { 
      $obj = new self(); 
      $obj->attributes = $ia; 

      return $obj; 
     } 

     public static parseFromListArray($la) { 
      $output = []; 
      foreach($la as $li) 
      { 
       $output[] = self::parseFromItemArray($ia); 
      } 
      return $output; 
     } 
} 

あなたはAPIからJSONデータを取得すると、あなたがこの方法でインポートすることができます。

// $jsonString is data from api 
// I'll use json_encode second parameter to specify that I want and associative array and not an object 
// jsonData = json_encode($jsonString, true); 

$products = Product::parseFromItemArray($jsonData); 

それは可能性があり良い薄いkを使用してparseFromListArrayを共有モデルに入れて、毎回モデルごとに書き換えないようにしてください。

また、この方法でインポートデータメソッドを完全に制御できます。クラスに新しいメンバーを追加して、インポートする新しいプロパティを追加するだけで十分です。

+0

ありがとうございました、Yii2-wayでOKです。 – showmeyourcode

関連する問題