2017-01-28 66 views
0

我從2個API獲得一些產品信息(考慮添加第三個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的數據。我找到的最簡單的方法是在我的前端控制器中獲取API的json數據,將其json_decode()發送到數組,然後將這些數組映射到模塊的模型中,並逐個字段地關聯。 但是,如果我想從API添加一些額外的字段或添加另一個API作爲源,它似乎是有害的。

我將非常感謝從有經驗的Yii2開發者處獲得一些技巧。

回答

0

取而代之的是接​​口,我將使用Model來從大規模賦值中獲得優勢。 然後,我將使用靜態方法獲取這些屬性,以便您在導入數據時擁有唯一的訪問點。

產品類

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似乎沒問題。 – showmeyourcode