2013-03-07 52 views
1

我正在用Zend Framework 2构建一个网上商店,这个网上商店将使用供应商提供的API。ZF2模块API - 什么结构和类?

我们想卖定制汽车产品,如进气口,空气悬挂部件&套件,车身套件,排气管,格栅,方向盘等

供应商提供了一个API(只是GET电话使用参数和逗号 - 分隔响应)具有以下功能

  • 产品

    • 按分类查找;
    • 汽车品牌搜索 - >型号 - >型号;
    • 按ID搜索;
    • 按名称搜索;
  • 订单

    • 添加;
    • 查看;
    • 删除。
  • 发票

    • 查看;
  • 股票获得通过orderId的当前值

  • 交货查看当前状态。

我建一个名为SupplierName模块。 我创建了一个Module.php文件:

<?php 
/** 
* This file is placed here for compatibility with ZendFramework 2's ModuleManager. 
* It allows usage of this module even without composer. 
* The original Module.php is in 'src/SupplierName/Module.php' in order to 
* respect the PSR-0 convention 
*/ 
require_once __DIR__ . '/src/SupplierName/Module.php'; 

供应商/ SupplierName/src目录/ SupplierName/Module.php

<?php 

namespace SupplierName; 

class Module 
{ 
    public function getConfig() 
    { 
     return include __DIR__ . '/../../config/module.config.php'; 
    } 

    public function getAutoloaderConfig() 
    { 
     return array(
      'Zend\Loader\StandardAutoloader' => array(
       'namespaces' => array(
        __NAMESPACE__ => __DIR__, 
       ), 
      ), 
     ); 
    } 
} 

在我我用的是主模块的IndexController的的indexAction代码在下面加载我的模块。

$supplierNameClient = $this->getServiceLocator()->get('SupplierName\Client'); 

现在我的问题就来了......这是我第一次会的建设,只有将用于从外部资源加载数据,并把它传递给我自己的系统的模块。问题是,我没有设法想到我的模块的良好结构...我认为应该有一个类每种产品类型(烧烤,排气,steeringWheel等),订单,发票等。

我一直在寻找并看着http://modules.zendframework.com/page/2?query=api。有一个应该用来与web服务进行通信的模块列表。

任何人都可以告诉我在哪里寻找信息/样本来构建这样的模块? 或者任何人都可以给我一个例子,我应该如何构建这个模块?

非常感谢提前,如果有什么不清楚,请让我知道,所以我可以解释它!

回答

2

我会这样做的方法是为每种产品类型创建一个实体类。这些是简单的PHP类,具有代表产品的属性和相关方法。例如

namespace SupplierName\Entity; 

class SteeringWheel 
{ 
    protected $diameter; 

    public function getDiameter() 
    { 
     return $this->diameter; 
    } 

    public function setDiameter($diameter) 
    { 
     $this->diameter = $diameter; 
     return $this; 
    } 

} 

要获取这些实体,我会使用一个映射器类来与外部进行通信。例如

namespace SupplierName\Mapper; 

class SteeringWheelMapper extends AbstractWebServiceMapper 
{ 
    public function fetchbyDiameter($diameter) { 
     // construct search query and then call up a parent 
     // class method that calls the vendor's webservice 
     // that presumably returns an array of data. 
     // 
     // Within this method, convert that array of data into a 
     // set of SteeringWheel objects and return. 
    } 
} 

的交谈与外部资源的公共代码存储在AbstractVendorWebServiceMapper(也许支持类),用SteeringWheelMapper专业化与方向盘单独处理和创建SteeringWheel实体。

然后,我可能会将一个EventManager添加到映射器,以便我可以设置事件和侦听器来缓存供应商的Web服务中的数据。

+0

谢谢罗布! 当我想要显示方向盘时,API需要品牌名称,系列名称和型号名称。我可以拨打https://apiurl.com/steering-wheels/car-brand-list。该URL给我一个汽车品牌清单。我应该在SteeringWheelMapper中创建一个方法并返回一个数组吗?这是做到这一点的方式吗? – 2013-03-08 10:18:10

+0

我想使用\ Zend \ Http \ Client进行HTTP调用。我在vendor/SupplierName/src/Suppliername/Mapper/AbstractWebServiceMapper中创建了一个文件。我是否应该将一个带有\ Zend \ Http \ Client实例的var注入AbstractWebServiceMapper,并让Suppliername \ Mapper \ SteeringWheelMapper扩展供应商名称\映射器\ AbstrachtWebServicemapper?只要检查'如果我正确理解你的想法... – 2013-03-08 10:44:50

+1

这就是我要做的,是的。通过ServiceManager注入配置的“客户端”。 – 2013-03-08 10:58:51