我想从控制器调用 SteeringWheelMapper->fetchCarBrandList() 方法。这现在很好用,但是有一个问题。
SteeringWheelMapper 扩展了 AbstractWebServiceMapper,它有一个需要 \Zend\Http\Client 实例的构造方法。
正如您在我的 module.config.php 文件中看到的那样,我使用“工厂”来实例化我的 SteeringWheelMapper。供应商有多种产品,所以我将不得不构建多个映射器。在当前情况下,这意味着我必须为扩展 AbstractWebServiceMapper 的每个映射器添加一个工厂配置的键。
例如,当我想添加一个 ExhaustMapper 时,我必须添加
SupplierName\Mapper\Exhaust => function ($serviceMapper) {
$httpClient => new \Zend\Http\Client;
return new SupplierName\Mapper\ExhaustMapper($httpClient);
}
现在我在重复自己,因为我还必须为 SupplierName\Mapper\SteeringWheelMapper 执行此操作。
我认为应该有一种方法可以为所有映射器创建工厂,而不是在工厂配置中添加新密钥。我的想法对吗?有没有人建议我应该如何做到这一点?
请看下面的代码。
我正在使用 ZF2,并使用此设置:/vendor
供应商名称
- 配置
- 模块.config.php
- 日志
- 日志.log
- 源代码
- 供应商名称
- 实体
- 抽象实体.php
- SteeringWheelEntity.php
- 映射器
- AbstractWebServiceMapper.php
- SteeringWheelMapper.php
- 实体
- 供应商名称
$steeringWheelMapper = $this->getServiceLocator()->get('SupplierName\Mapper\SteeringWheel'); $carBrandList = $steeringWheelMapper->fetchCarBrandsList();
- 配置
SteeringWheelMapper.php
<?php
namespace SupplierName\Mapper;
class SteeringWheelMapper extends AbstractWebServiceMapper
{
public function fetchCarBrandList()
{
// Code for request
// Dispatch HTTP request
$this->dispatch();
}
}
我的 SupplierName/config/module.config.php 看起来像这样:
<?php
return array(
'service_manager' => array(
'factories' => array(
'SupplierName\Mapper\SteeringWheel' => function ($serviceManager) {
$httpClient = new \Zend\Http\Client;
return new SupplierName\Mapper\SteeringWheelMapper($httpClient);
},
),
),
'supplier_name' => array(
'api' => array(
'url' => 'http://api.example.com',
),
'log' => array(
'file_location' => __DIR__ . '/../log/log.log',
),
),
);