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

Serialization Yii2-通过不同API处理模型的最佳方法,serialization,yii2,Serialization,Yii2,我从2个API中获得了一些产品信息(考虑添加第三个API)。我的应用程序有一个模块,其中包含如下界面(将在主应用程序中实现): interface ProductInterface { public function getId(); public function getSku(); /** @return GalleryImageInterface[] */ public function getImages(); ... } 接口产品接口 {

我从2个API中获得了一些产品信息(考虑添加第三个API)。我的应用程序有一个模块,其中包含如下界面(将在主应用程序中实现):

interface ProductInterface { public function getId(); public function getSku(); /** @return GalleryImageInterface[] */ public function getImages(); ... } 接口产品接口 { 公共函数getId(); 公共函数getSku(); /**@return GalleryImageInterface[]*/ 公共函数getImages(); ... } 接口GalleryImage接口 { 公共函数getId(); 公共函数getUrl(); ... } 目标是以正确的方式处理API数据,以创建实现这些接口的产品列表。我发现的最简单的方法是在我的前端控制器中获取API的json数据,json_decode()将其转换为数组,然后将这些数组映射到模块的模型中,逐字段映射关系。 但若我想从API中添加一些额外的字段或添加另一个API作为源代码,那个么它似乎并没有什么害处


我将非常感谢从经验丰富的Yii2开发人员那里获得一些技巧。

我将使用模型来代替接口,从大量分配中获得优势。 然后,我将在静态方法中获取这些属性,这样当您想要导入数据时,您就有了一个唯一的访问点

产品类别

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;
      }           
}
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;
      } 
}
GalleryImage类

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;
      }           
}
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放在共享模型中可能是一个好主意,这样您就不必每次都重写每个模型

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