0

コントローラから SteeringWheelMapper->fetchCarBrandList() メソッドを呼び出したいと思います。これでうまくいきましたが、問題があります。

SteeringWheelMapper は、\Zend\Http\Client のインスタンスを必要とする構成メソッドを持つ AbstractWebServiceMapper を拡張します。

私の module.config.php ファイルでわかるように、SteeringWheelMapper のインスタンス化に「factories」を使用しています。サプライヤには複数の製品があるため、複数のマッパーを作成する必要があります。現在の状況では、AbstractWebServiceMapper を拡張するすべてのマッパーのファクトリ構成にキーを追加する必要があることを意味します。

たとえば、ExhaustMapper を追加する場合は、追加する必要があります

SupplierName\Mapper\Exhaust => function ($serviceMapper) {
    $httpClient => new \Zend\Http\Client;

    return new SupplierName\Mapper\ExhaustMapper($httpClient);
}

SupplierName\Mapper\SteeringWheelMapper に対してもこれを行う必要があるため、繰り返します。

ファクトリ構成に新しいキーを追加する代わりに、すべてのマッパーのファクトリを作成する方法が必要だと思います。私の考えは正しいですか?誰かが私がこれを行う方法を提案していますか?

以下のコードを参照してください。

私は ZF2 を使用しており、次のセットアップを使用しています: /vendor

  • サプライヤ名

    • 構成
      • module.config.php
    • ログ
      • ログ.ログ
    • ソース
      • サプライヤ名
        • 実在物
          • AbstractEntity.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',
        ),
    ),
);
4

2 に答える 2

1

実際に話しているのは抽象ファクトリであり、サービスマネージャはこの概念をサポートしていますが、独自に作成する必要があります。これは、すべてのマッパーがで始まると想定した例です。SupplierName\Mapper

<?php
namespace SupplierName\Services;

use Zend\ServiceManager\AbstractFactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

class MapperAbstractFactory implements AbstractFactoryInterface
{
    public function canCreateServiceWithName(ServiceLocatorInterface $locator, $name, $requestedName)
    {
        if (0 === strpos($requestedName, 'SupplierName\\Mapper') && class_exists($requestedName)){
            return true;
        }
        return false;
    }

    public function createServiceWithName(ServiceLocatorInterface $locator, $name, $requestedName)
    {
        $httpClient = new \Zend\Http\Client;

        return new $requestedName($httpClient);
    }
}

サービス構成で、抽象ファクトリキーと抽象ファクトリのfqcnを追加し$sm->get('SupplierName\Mapper\SomeClass');ます。クラスが存在する場合はいつでも呼び出すと、合成インスタンスが返されます。

public function getServiceConfig()
{       
    return array(
        'abstract_factories' => array(    
            'SupplierName\Services\MapperAbstractFactory'
        ),
    );
}
于 2013-03-09T13:19:27.020 に答える
1

最終的な解決策:

<?php
// module/Application/src/Application/Controller/IndexController.php

namespace Application\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Zend\I18n\Translator\Translator;

class IndexController extends AbstractActionController
{
    protected $translator;

    public function __construct(Translator $translator)
    {
        $this->translator = $translator;
    }

    public function indexAction()
    {                
        $steeringWheelMapper = $this->getServiceLocator()->get('SupplierName\Mapper\SteeringWheel');
        $carBrandList = $steeringWheelMapper->fetchCarBrandList();

        return new ViewModel();
    }

}

<?php
// vendor/SupplierName/src/SupplierName/Module.php

namespace SupplierName;

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

    public function getServiceConfig()
    {   
        return array(
            'abstract_factories' => array(    
                'SupplierName\Mapper\MapperAbstractFactory'
            ),
        );
    }

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

}

<?php
// vendor/SupplierName/src/SupplierName/Mapper/SteeringWheelMapper.php

namespace SupplierName\Mapper;

class SteeringWheelMapper extends AbstractWebServiceMapper
{   
    public function fetchCarBrandList()
    {
        $this->dispatch();
    }
}

<?php
// vendor/SupplierName/src/SupplierName/Mapper/AbstractWebServiceMapper.php

namespace SupplierName\Mapper;

use \Zend\Http\Client;

class AbstractWebServiceMapper
{
    public function __construct(Client $client)
    {

    }

    public function dispatch()
    {       

    }

}

<?php
// vendor/SupplierName/src/SupplierName/Mapper/MapperAbstractFactory.php
namespace SupplierName\Mapper;

use Zend\ServiceManager\AbstractFactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

use \Zend\Http\Client;

class MapperAbstractFactory implements AbstractFactoryInterface
{
    public function canCreateServiceWithName(ServiceLocatorInterface $locator, $name, $requestedName)
    {    
        if (0 === strpos($requestedName, 'SupplierName\Mapper')) {
            $requestedName .= 'Mapper';

            if (class_exists($requestedName)) {
                return true;
            }
        }

        return false;
    }

    public function createServiceWithName(ServiceLocatorInterface $locator, $name, $requestedName)
    {
        $requestedName .= 'Mapper';

        $httpClient = new Client();

        return new $requestedName($httpClient);
    }
}
于 2013-03-10T12:03:36.700 に答える