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

时间:2017-01-28 06:34:54

标签: serialization yii2

我从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 个答案:

答案 0 :(得分: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放在共享模型中可能是个好主意,因此您不必每次都为每个模型重写。

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