2017-01-28 32 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