我想知道是否有人可以提供帮助,所以我需要找出正确的设计模式,我希望有人能指出我正确的方向。
所以基本上我使用symfony2,我使用一个包来处理我的soap请求到第三方api进行身份检查用户但是我需要构建服务,为soap请求构建xml并添加一些额外的东西到包含身份检查集合的用户实体。
我坚持如何正确构建服务,如何使服务第三方不可知?我是否可以创建服务接口,然后可以使用它来生成第三方特定服务?那么我是否构建了一个映射到第三方结果的实体,但这又是一个我为特定第三方扩展的接口吗?
必须有一个设计模式,但我不知道甚至谷歌或寻找什么。
提前致谢。
加成
我想也许我可以使用Bridge模式,但不是100%确定
答案 0 :(得分:1)
我建议你实现一个Factory方法,让Symfony为你实例化正确的类(如here所述)。 像这个例子:
假设您有一个可以定义为接口的简单(外部)服务:
<?php
namespace Acme\DemoBundle\Service\Integration;
interface ExternalServiceInterface {
public function call($object)
}
定义这样的工厂:
<?php
namespace Acme\DemoBundle\Service\Integration;
class ESServiceFactory {
/**
* @var array of integration strategy
* key = strategy key name
* value = service implements the behaviour
*/
protected $services;
function __construct($services)
{
$this->services=$services;
}
/**
* @param $type: strategy key name
* @return \Acme\DemoBundle\Service\Integration\ExternalServiceInterface;
*/
public function get($type)
{
return $this->services[$type];
}
}
并将服务定义为:
services.yml
services:
# The real Soap Services
acme.integration.soap:
class: Acme\DemoBundle\Service\Integration\ExternalServiceSoapCaller
arguments: [%acme.soap_base_url%, %acme.api_key%, @logger]
# Mocked service: response with fixed value (true). For tests pourpose
acme.integration.es_a_true:
class: Acme\DemoBundle\Service\Tests\ExternalServiceMock
arguments: [true]
# Mocked service: response with fixed value (true). For tests pourpose
acme.integration.es_false:
class: Acme\DemoBundle\Service\Tests\ExternalServiceMock
arguments: [false]
sd_factory:
class: Acme\DemoBundle\Service\Integration\ESServiceFactory
arguments:
-service_available:
'SOAP': @acme.integration.soap
'MOCK_ALWAYS_TRUE': @acme.integration.es_a_true
'MOCK_ALWAYS_FALSE': @acme.integration.es_a_false
external_service_manager:
class: "Acme\DemoBundle\Service\Integration\ExternalServiceInterface"
factory_service: sd_factory
factory_method: get
arguments: [%params_defined_in_parametes_yml%]
在实践中,您可以在参数中定义您想要的策略,例如&#39; SOAP&#39;或者是你的控制器/服务中的模拟回复:
$response = $this->get('external_service_manager')->call($obj);
希望得到这个帮助。