ZF2模块API - 什么结构和类?

时间:2013-03-07 18:08:44

标签: php api architecture module zend-framework2

我正在使用Zend Framework 2构建一个网上商店,这个网上商店将使用供应商提供的API。

我们想销售定制汽车产品,如进气口,空气悬架零件和套件,车身套件,排气装置,格栅,方向盘等。

供应商提供API(只有GET调用params和逗号分隔的响应),具有以下功能

  • 产品

    • 按类别搜索;
    • 按汽车品牌搜索 - >模型 - >类型;
    • 按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');

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

我一直在寻找http://modules.zendframework.com/page/2?query=api。有一个列表,其中包含用于与Web服务进行通信的模块。

有人能告诉我在哪里寻找信息/样本来构建这样的模块吗? 或者任何人都可以举例说明我应该如何构建这个模块?

非常感谢,如果事情不清楚,请告诉我,以便我解释一下!

1 个答案:

答案 0 :(得分:2)

我接近这个的方法是为每种产品类型创建一个实体类。这些是简单的PHP类,包含表示产品的属性和相关方法。 e.g。

namespace SupplierName\Entity;

class SteeringWheel
{
    protected $diameter;

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

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

}

要获取这些实体,我会使用与外部对话的mapper类。 e.g。

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服务的数据。