首页 文章

Yii2 - 处理不同API模型的最佳方法

提问于
浏览
1

我从2个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开发者那里获得一些技巧 .

1 回答

  • 1

    相反,接口,我将使用模型,从大规模任务中获得优势 . 然后,我将在静态方法中获取这些属性,因此当您要导入数据时,您有一个唯一的访问点 .

    Product class

    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 class

    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放在共享模型中可能是一个很好的想法,因此您不必每次都为每个模型重写 .

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

相关问题