Skip to content

Commit e6beef5

Browse files
authored
Merge pull request #14 from tmirks/enable-symfony-bundle
Get basic bundle configuration working for SoapClient with Symfony 3.x.
2 parents 073028f + 69a7005 commit e6beef5

File tree

7 files changed

+121
-73
lines changed

7 files changed

+121
-73
lines changed

src/BeSimple/SoapBundle/DependencyInjection/BeSimpleSoapExtension.php

Lines changed: 65 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414

1515
use BeSimple\SoapCommon\Cache;
1616

17+
use BeSimple\SoapCommon\SoapOptions\SoapOptions;
18+
use Carpages\Core\Entity\ContactPhone;
1719
use Symfony\Component\Config\Definition\Processor;
1820
use Symfony\Component\Config\FileLocator;
1921
use Symfony\Component\DependencyInjection\ContainerBuilder;
@@ -41,6 +43,7 @@ public function load(array $configs, ContainerBuilder $container)
4143
$loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
4244

4345
$loader->load('request.xml');
46+
$loader->load('soap.xml');
4447

4548
$loader->load('loaders.xml');
4649
$loader->load('converters.xml');
@@ -53,8 +56,8 @@ public function load(array $configs, ContainerBuilder $container)
5356

5457
$this->registerCacheConfiguration($config['cache'], $container, $loader);
5558

56-
if (!empty($config['clients'])) {
57-
$this->registerClientConfiguration($config['clients'], $container, $loader);
59+
if ( ! empty($config['clients'])) {
60+
$this->registerClientConfiguration($config, $container, $loader);
5861
}
5962

6063
$container->setParameter('besimple.soap.definition.dumper.options.stylesheet', $config['wsdl_dumper']['stylesheet']);
@@ -69,11 +72,9 @@ public function load(array $configs, ContainerBuilder $container)
6972

7073
private function registerCacheConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader)
7174
{
72-
$loader->load('soap.xml');
73-
7475
$config['type'] = $this->getCacheType($config['type']);
7576

76-
foreach (array('type', 'lifetime', 'limit') as $key) {
77+
foreach (array('type', 'file') as $key) {
7778
$container->setParameter('besimple.soap.cache.'.$key, $config[$key]);
7879
}
7980
}
@@ -82,22 +83,33 @@ private function registerClientConfiguration(array $config, ContainerBuilder $co
8283
{
8384
$loader->load('client.xml');
8485

85-
foreach ($config as $client => $options) {
86-
$definition = new DefinitionDecorator('besimple.soap.client.builder');
87-
$container->setDefinition(sprintf('besimple.soap.client.builder.%s', $client), $definition);
88-
89-
$definition->replaceArgument(0, $options['wsdl']);
90-
91-
$defOptions = $container
92-
->getDefinition('besimple.soap.client.builder')
93-
->getArgument(1);
94-
95-
foreach (array('cache_type', 'user_agent') as $key) {
96-
if (isset($options[$key])) {
97-
$defOptions[$key] = $options[$key];
98-
}
99-
}
100-
86+
foreach ($config['clients'] as $client => $options) {
87+
$soapClientOpts = new DefinitionDecorator('besimple.soap.client_options');
88+
$soapOpts = new DefinitionDecorator('besimple.soap.options');
89+
90+
$soapClientOptsService = sprintf('besimple.soap.client_options.%s', $client);
91+
$soapOptsService = sprintf('besimple.soap.options.%s', $client);
92+
93+
// configure SoapClient
94+
$definition = new DefinitionDecorator('besimple.soap.client');
95+
96+
$container->setDefinition(
97+
sprintf('besimple.soap.client.%s', $client),
98+
$definition
99+
);
100+
$container->setDefinition(
101+
$soapClientOptsService,
102+
$soapClientOpts
103+
);
104+
$container->setDefinition(
105+
$soapOptsService,
106+
$soapOpts
107+
);
108+
109+
$definition->replaceArgument(0, new Reference($soapClientOptsService));
110+
$definition->replaceArgument(1, new Reference($soapOptsService));
111+
112+
// configure proxy
101113
$proxy = $options['proxy'];
102114
if (false !== $proxy['host']) {
103115
if (null !== $proxy['auth']) {
@@ -108,49 +120,58 @@ private function registerClientConfiguration(array $config, ContainerBuilder $co
108120
}
109121
}
110122

111-
$definition->addMethodCall('withProxy', array(
112-
$proxy['host'], $proxy['port'],
113-
$proxy['login'], $proxy['password'],
114-
$proxy['auth']
115-
));
116-
}
117-
118-
if (isset($defOptions['cache_type'])) {
119-
$defOptions['cache_type'] = $this->getCacheType($defOptions['cache_type']);
123+
$proxy = $this->createClientProxy($client, $proxy, $container);
124+
$soapClientOpts->setFactory([
125+
'%besimple.soap.client_options_builder.class%',
126+
'createWithProxy'
127+
]);
128+
$soapClientOpts->setArgument(0, new Reference($proxy));
120129
}
121130

122-
$definition->replaceArgument(1, $defOptions);
131+
// configure SoapOptions for client
132+
$classMap = $this->createClientClassMap($client, $options['classmap'], $container);
123133

124-
$classmap = $this->createClientClassmap($client, $options['classmap'], $container);
125-
$definition->replaceArgument(2, new Reference($classmap));
134+
$soapOpts->replaceArgument(0, $config['cache']['file']);
135+
$soapOpts->replaceArgument(1, new Reference($classMap));
136+
$soapOpts->replaceArgument(2, $this->getCacheType($config['cache']['type']));
126137

127-
$this->createClient($client, $container);
138+
if ($config['cache']['version'] == SoapOptions::SOAP_VERSION_1_1) {
139+
$soapOpts->setFactory([
140+
'%besimple.soap.options_builder.class%',
141+
'createWithClassMapV11'
142+
]);
143+
}
128144
}
129145
}
130146

131-
private function createClientClassmap($client, array $classmap, ContainerBuilder $container)
147+
private function createClientClassMap($client, array $classmap, ContainerBuilder $container)
132148
{
133149
$definition = new DefinitionDecorator('besimple.soap.classmap');
134150
$container->setDefinition(sprintf('besimple.soap.classmap.%s', $client), $definition);
135151

136-
if (!empty($classmap)) {
152+
if ( ! empty($classmap)) {
137153
$definition->setMethodCalls(array(
138-
array('set', array($classmap)),
154+
array('__construct', array($classmap)),
139155
));
140156
}
141157

142158
return sprintf('besimple.soap.classmap.%s', $client);
143159
}
144160

145-
private function createClient($client, ContainerBuilder $container)
161+
private function createClientProxy($client, array $proxy, ContainerBuilder $container)
146162
{
147-
$definition = new DefinitionDecorator('besimple.soap.client');
148-
$container->setDefinition(sprintf('besimple.soap.client.%s', $client), $definition);
163+
$definition = new DefinitionDecorator('besimple.soap.client.proxy');
164+
$container->setDefinition(sprintf('besimple.soap.client.proxy.%s', $client), $definition);
165+
166+
if ( ! empty($proxy)) {
167+
$definition->replaceArgument(0, $proxy['host']);
168+
$definition->replaceArgument(1, $proxy['port']);
169+
$definition->replaceArgument(2, $proxy['login']);
170+
$definition->replaceArgument(3, $proxy['password']);
171+
$definition->replaceArgument(4, $proxy['auth']);
172+
}
149173

150-
$definition->setFactory(array(
151-
new Reference(sprintf('besimple.soap.client.builder.%s', $client)),
152-
'build'
153-
));
174+
return sprintf('besimple.soap.client.proxy.%s', $client);
154175
}
155176

156177
private function createWebServiceContext(array $config, ContainerBuilder $container)

src/BeSimple/SoapBundle/DependencyInjection/Configuration.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,10 @@ private function addCacheSection(ArrayNodeDefinition $rootNode)
6464
->thenInvalid(sprintf('The cache type has to be either %s', implode(', ', $this->cacheTypes)))
6565
->end()
6666
->end()
67+
->scalarNode('version')->defaultNull()->end()
68+
->scalarNode('encoding')->defaultNull()->end()
69+
->scalarNode('keepalive')->defaultNull()->end()
70+
->scalarNode('file')->defaultNull()->end()
6771
->scalarNode('lifetime')->defaultNull()->end()
6872
->scalarNode('limit')->defaultNull()->end()
6973
->end()

src/BeSimple/SoapBundle/Resources/config/client.xml

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,26 @@
44
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
55

66
<parameters>
7-
<parameter key="besimple.soap.client.builder.class">BeSimple\SoapBundle\Soap\SoapClientBuilder</parameter>
8-
<parameter key="besimple.soap.classmap.class">BeSimple\SoapCommon\Classmap</parameter>
7+
<parameter key="besimple.soap.client.builder.class">BeSimple\SoapClient\SoapClientBuilder</parameter>
8+
<parameter key="besimple.soap.client.class">BeSimple\SoapClient\SoapClient</parameter>
9+
<parameter key="besimple.soap.client.proxy.class">BeSimple\SoapClient\SoapServerProxy\SoapServerProxy</parameter>
910
</parameters>
1011

1112
<services>
12-
<service id="besimple.soap.client.builder" class="%besimple.soap.client.builder.class%" abstract="true">
13-
<argument /> <!-- wsdl URI -->
14-
<argument type="collection">
15-
<argument key="debug">%kernel.debug%</argument>
16-
</argument>
17-
<argument type="service" id="besimple.soap.classmap" />
18-
<argument type="service" id="besimple.soap.converter.collection" />
19-
<argument type="service" id="besimple.soap.cache" /> <!-- hack to load besimple cache configuration -->
20-
</service>
2113

22-
<service id="besimple.soap.client" class="%besimple.soap.client.builder.class%" abstract="true">
23-
<factory class="besimple.soap.client.builder" method="build" />
14+
<service id="besimple.soap.client" class="%besimple.soap.client.class%" abstract="true">
15+
<factory class="%besimple.soap.client.builder.class%" method="build" />
16+
<argument type="service" id="besimple.soap.client_options" />
17+
<argument type="service" id="besimple.soap.options" /> <!-- hack to load besimple cache configuration -->
2418
</service>
2519

26-
<service id="besimple.soap.classmap" class="%besimple.soap.classmap.class%" abstract="true" />
20+
<service id="besimple.soap.client.proxy" class="%besimple.soap.client.proxy.class%" abstract="true">
21+
<argument id="$host" />
22+
<argument id="$port" />
23+
<argument id="$login" />
24+
<argument id="$password" />
25+
<argument id="$authenticationType" />
26+
</service>
2727
</services>
2828

2929
</container>

src/BeSimple/SoapBundle/Resources/config/soap.xml

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,31 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<container xmlns="http://symfony.com/schema/dic/services"
3-
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4-
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
55

66
<parameters>
7-
<parameter key="besimple.soap.cache.class">BeSimple\SoapBundle\Cache</parameter>
8-
<parameter key="besimple.soap.cache.dir">%kernel.cache_dir%/besimple/soap</parameter>
7+
<parameter key="besimple.soap.classmap.class">BeSimple\SoapCommon\ClassMap</parameter>
8+
<parameter key="besimple.soap.client_options.class">BeSimple\SoapClient\SoapOptions\SoapClientOptions</parameter>
9+
<parameter key="besimple.soap.client_options_builder.class">BeSimple\SoapClient\SoapClientOptionsBuilder</parameter>
10+
<parameter key="besimple.soap.options.class">BeSimple\SoapCommon\SoapOptions\SoapOptions</parameter>
11+
<parameter key="besimple.soap.options_builder.class">BeSimple\SoapCommon\SoapOptionsBuilder</parameter>
12+
<parameter key="besimple.soap.cache.dir">%kernel.cache_dir%</parameter>
913
</parameters>
1014

1115
<services>
12-
<service id="besimple.soap.cache" class="%besimple.soap.cache.class%">
13-
<argument>%kernel.debug%</argument>
16+
<service id="besimple.soap.client_options" class="%besimple.soap.client_options.class%" abstract="true">
17+
<!-- call the static method -->
18+
<factory class="%besimple.soap.client_options_builder.class%" method="createWithDefaults" />
19+
</service>
20+
21+
<service id="besimple.soap.classmap" class="%besimple.soap.classmap.class%" abstract="true" />
22+
23+
<service id="besimple.soap.options" class="%besimple.soap.options.class%" abstract="true">
24+
<factory class="%besimple.soap.options_builder.class%" method="createWithClassMap" />
25+
<argument>%besimple.soap.cache.file%</argument>
26+
<argument type="service" id="besimple.soap.classmap" />
1427
<argument>%besimple.soap.cache.type%</argument>
15-
<argument>%besimple.soap.cache.dir%/cache</argument>
16-
<argument>%besimple.soap.cache.lifetime%</argument>
17-
<argument>%besimple.soap.cache.limit%</argument>
28+
<argument>%besimple.soap.cache.dir%</argument>
1829
</service>
1930
</services>
2031

src/BeSimple/SoapBundle/Resources/config/webservice.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
<parameter key="besimple.soap.binder.request_header.documentwrapped.class">BeSimple\SoapBundle\ServiceBinding\DocumentLiteralWrappedRequestHeaderMessageBinder</parameter>
1616
<parameter key="besimple.soap.binder.response.documentwrapped.class">BeSimple\SoapBundle\ServiceBinding\DocumentLiteralWrappedResponseMessageBinder</parameter>
1717
<parameter key="besimple.soap.type.repository.class">BeSimple\SoapCommon\Definition\Type\TypeRepository</parameter>
18-
<parameter key="besimple.soap.server.classmap.class">BeSimple\SoapServer\Classmap</parameter>
18+
<parameter key="besimple.soap.server.classmap.class">BeSimple\SoapCommon\ClassMap</parameter>
1919
</parameters>
2020

2121
<services>

src/BeSimple/SoapClient/SoapClientOptionsBuilder.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,18 @@ public static function createWithTracing()
4545
);
4646
}
4747

48+
public static function createWithProxy($proxy)
49+
{
50+
return new SoapClientOptions(
51+
SoapClientOptions::SOAP_CLIENT_TRACE_ON,
52+
SoapClientOptions::SOAP_CLIENT_EXCEPTIONS_ON,
53+
CurlOptions::DEFAULT_USER_AGENT,
54+
SoapClientOptions::SOAP_CLIENT_COMPRESSION_NONE,
55+
SoapClientOptions::SOAP_CLIENT_AUTHENTICATION_NONE,
56+
$proxy
57+
);
58+
}
59+
4860
public static function createWithEndpointLocation($endpointLocation)
4961
{
5062
return new SoapClientOptions(

src/BeSimple/SoapCommon/Definition/Type/TypeRepository.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
namespace BeSimple\SoapCommon\Definition\Type;
1414

15-
use BeSimple\SoapCommon\Classmap;
15+
use BeSimple\SoapCommon\ClassMap;
1616

1717
/**
1818
* @author Christian Kerl <christian-kerl@web.de>
@@ -27,7 +27,7 @@ class TypeRepository
2727

2828
protected $classmap;
2929

30-
public function __construct(Classmap $classmap = null)
30+
public function __construct(ClassMap $classmap = null)
3131
{
3232
$this->classmap = $classmap;
3333
}
@@ -77,7 +77,7 @@ public function addComplexType(ComplexType $type)
7777
$phpType = $type->getPhpType();
7878

7979
$this->types[$phpType] = $type;
80-
$this->addClassmap($type->getXmlType(), $phpType);
80+
$this->addClassMap($type->getXmlType(), $phpType);
8181
}
8282

8383
public function hasType($type)
@@ -119,12 +119,12 @@ public function getArrayOf($arrayType)
119119
return $match[1];
120120
}
121121

122-
public function getClassmap()
122+
public function getClassMap()
123123
{
124124
return $this->classmap;
125125
}
126126

127-
protected function addClassmap($xmlType, $phpType)
127+
protected function addClassMap($xmlType, $phpType)
128128
{
129129
if (!$this->classmap) {
130130
return;

0 commit comments

Comments
 (0)