我从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开发者那里获得一些技巧。
答案 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放在共享模型中可能是个好主意,因此您不必每次都为每个模型重写。
此外,通过这种方式,您可以完全控制导入数据方法,并且应该在类中添加新成员以添加要导入的新属性。