【问题标题】:Yii2 - best way to handle models over different APIsYii2 - 通过不同 API 处理模型的最佳方式
【发布时间】:2017-01-28 22:45:17
【问题描述】:

我从 2 个 API 获取了一些产品信息(考虑添加第三个)。我的应用程序的模块包含这样的接口(将在主应用程序中实现):

接口产品接口 { 公共函数 getId(); 公共函数 getSku(); /** @return GalleryImageInterface[] */ 公共函数 getImages(); ... } 界面 GalleryImageInterface { 公共函数 getId(); 公共函数 getUrl(); ... }

目标是以正确的方式处理 API 数据,以创建实现这些接口的产品列表。我发现的最简单的方法是在我的前端控制器中获取 API 的 json 数据,将其 json_decode() 映射到数组,然后将这些数组映射到模块的模型,逐个字段与关系。 但是如果我想从 API 添加一些额外的字段或添加另一个 API 作为源,这似乎没什么害处。

我将非常感谢有经验的 Yii2 开发人员提供一些建议。

【问题讨论】:

    标签: serialization yii2


    【解决方案1】:

    我将使用模型代替接口,以从大规模分配中获得优势。 然后,我会在静态方法中获取这些属性,以便您在导入数据时拥有唯一的访问点。

    产品类别

    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);
    

    将 parseFromListArray 放在共享模型中可能是个好主意,这样您就不必每次都为每个模型重写。

    此外,通过这种方式,您可以完全控制导入数据的方法,并且足以在类中添加新成员来添加要导入的新属性。

    【讨论】:

      猜你喜欢
      • 2010-09-26
      • 1970-01-01
      • 2015-09-04
      • 2012-01-10
      • 1970-01-01
      • 2013-11-27
      • 1970-01-01
      • 1970-01-01
      • 2012-07-20
      相关资源
      最近更新 更多