【问题标题】:ZF2 Module API - What structure and classes?ZF2 Module API - 什么结构和类?
【发布时间】:2013-02-23 02:06:31
【问题描述】:

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

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

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

  • 产品

    • 按类别搜索;
    • 按汽车品牌搜索-->车型-->类型;
    • 按 ID 搜索;
    • 按名称搜索;
  • 订单

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

    • 查看;
  • Stock获取当前值

  • Delivery 按 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';

vendor/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 服务通信的模块的列表。

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

非常感谢,如果有不清楚的地方,请告诉我,以便我解释!

【问题讨论】:

    标签: php api architecture module zend-framework2


    【解决方案1】:

    我的方法是为每种产品类型创建一个实体类。这些是简单的 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 服务的数据。

    【讨论】:

    • 谢谢你,罗伯!当我想展示方向盘时,API 需要品牌名称、系列名称和型号名称。我可以拨打apiurl.com/steering-wheels/car-brand-list。该 URL 为我提供了汽车品牌列表。我应该只在 SteeringWheelMapper 中创建一个方法并返回一个数组吗?是这样的吗?
    • 我想使用 \Zend\Http\Client 进行 HTTP 调用。我在 vendor/SupplierName/src/Suppliername/Mapper/AbstractWebServiceMapper 中创建了一个文件。我是否应该将带有 \Zend\Http\Client 实例的 var 注入 AbstractWebServiceMapper 并让 Suppliername\Mapper\SteeringWheelMapper 扩展 Suppliername\Mapper\AbstrachtWebServicemapper?如果我正确理解你的想法,请检查一下......
    • 这就是我要做的,是的。通过 ServiceManager 注入一个配置好的Client
    • 谢谢!我会接受你的回答,但对于那些有不同想法的人,请告诉我!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多