From c5902122bb84eb2932e92a17c049745605d6d812 Mon Sep 17 00:00:00 2001 From: Francis Besset Date: Sun, 14 Aug 2011 18:00:28 +0200 Subject: [PATCH] Added headers in request You can add @Soap\Header("foobar", phpType="string") in a method definition --- Controller/SoapWebServiceController.php | 58 ++++++++++-------- DependencyInjection/BeSimpleSoapExtension.php | 6 +- Resources/config/webservice.xml | 4 ++ .../RpcLiteralRequestHeaderMessageBinder.php | 33 ++++++++++ .../RpcLiteralRequestMessageBinder.php | 2 +- ServiceBinding/ServiceBinder.php | 36 +++++++---- ServiceDefinition/Annotation/Header.php | 22 +++++++ ServiceDefinition/Dumper/Wsdl.php | 37 ++++++++++++ ServiceDefinition/Dumper/WsdlDumper.php | 48 ++++++++++----- ServiceDefinition/Dumper/WsdlTypeStrategy.php | 4 +- .../Loader/AnnotationClassLoader.php | 60 +++++++++++-------- ServiceDefinition/Method.php | 15 ++++- ServiceDefinition/ServiceDefinition.php | 33 +++------- WebServiceContext.php | 10 ++-- 14 files changed, 256 insertions(+), 112 deletions(-) create mode 100644 ServiceBinding/RpcLiteralRequestHeaderMessageBinder.php create mode 100644 ServiceDefinition/Annotation/Header.php create mode 100644 ServiceDefinition/Dumper/Wsdl.php diff --git a/Controller/SoapWebServiceController.php b/Controller/SoapWebServiceController.php index e2dbd53..f801cb4 100644 --- a/Controller/SoapWebServiceController.php +++ b/Controller/SoapWebServiceController.php @@ -43,6 +43,11 @@ class SoapWebServiceController extends ContainerAware */ protected $serviceBinder; + /** + * @var array + */ + private $headers = array(); + /** * @return \BeSimple\SoapBundle\Soap\SoapResponse */ @@ -96,12 +101,14 @@ class SoapWebServiceController extends ContainerAware */ public function __call($method, $arguments) { - if ($this->serviceBinder->isServiceHeader($method)) { - // collect request soap headers - $this->soapRequest->getSoapHeaders()->add( - $this->serviceBinder->processServiceHeader($method, $arguments[0]) - ); - } elseif ($this->serviceBinder->isServiceMethod($method)) { + if ($this->serviceBinder->isServiceMethod($method)) { + foreach ($this->headers as $name => $value) { + if ($this->serviceBinder->isServiceHeader($method, $name)) { + $this->soapRequest->getSoapHeaders()->add($this->serviceBinder->processServiceHeader($method, $name, $value)); + } + } + $this->headers = null; + $this->soapRequest->attributes->add( $this->serviceBinder->processServiceMethodArguments($method, $arguments) ); @@ -127,9 +134,28 @@ class SoapWebServiceController extends ContainerAware $method, $this->soapResponse->getReturnValue() ); + } else { + // collect request soap headers + $this->headers[$method] = $arguments[0]; } } + /** + * @return \BeSimple\SoapBundle\Soap\SoapRequest + */ + public function getRequest() + { + return $this->soapRequest; + } + + /** + * @return \BeSimple\SoapBundle\Soap\SoapResponse + */ + public function getResponse() + { + return $this->soapResponse; + } + /** * Checks that the given Response is a SoapResponse. * @@ -148,28 +174,12 @@ class SoapWebServiceController extends ContainerAware return $response; } - /** - * @return \BeSimple\SoapBundle\Soap\SoapRequest - */ - public function getRequest() - { - return $this->soapRequest; - } - - /** - * @return \BeSimple\SoapBundle\Soap\SoapResponse - */ - public function getResponse() - { - return $this->soapResponse; - } - private function getWebServiceContext($webservice) { - if(!$this->container->has('besimple.soap.context.'.$webservice)) - { + if (!$this->container->has('besimple.soap.context.'.$webservice)) { throw new NotFoundHttpException(sprintf('No webservice with name "%s" found.', $webservice)); } + return $this->container->get('besimple.soap.context.'.$webservice); } } diff --git a/DependencyInjection/BeSimpleSoapExtension.php b/DependencyInjection/BeSimpleSoapExtension.php index e6a271f..e7ca025 100644 --- a/DependencyInjection/BeSimpleSoapExtension.php +++ b/DependencyInjection/BeSimpleSoapExtension.php @@ -28,7 +28,7 @@ class BeSimpleSoapExtension extends Extension // maps config options to service suffix private $bindingConfigToServiceSuffixMap = array( 'rpc-literal' => 'rpcliteral', - 'document-wrapped' => 'documentwrapped' + 'document-wrapped' => 'documentwrapped', ); public function load(array $configs, ContainerBuilder $container) @@ -60,8 +60,8 @@ class BeSimpleSoapExtension extends Extension $options = $container ->getDefinition('besimple.soap.context.'.$bindingSuffix) - ->getArgument(6); + ->getArgument(7); - $definition->replaceArgument(6, array_merge($options, $config)); + $definition->replaceArgument(7, array_merge($options, $config)); } } diff --git a/Resources/config/webservice.xml b/Resources/config/webservice.xml index 3dfa981..0722411 100644 --- a/Resources/config/webservice.xml +++ b/Resources/config/webservice.xml @@ -6,6 +6,7 @@ BeSimple\SoapBundle\WebServiceContext %kernel.cache_dir%/webservice + BeSimple\SoapBundle\ServiceBinding\RpcLiteralRequestHeaderMessageBinder BeSimple\SoapBundle\ServiceBinding\RpcLiteralRequestMessageBinder BeSimple\SoapBundle\ServiceBinding\RpcLiteralResponseMessageBinder BeSimple\SoapBundle\ServiceBinding\DocumentLiteralWrappedRequestMessageBinder @@ -19,6 +20,7 @@ + @@ -32,6 +34,7 @@ + @@ -42,6 +45,7 @@ + diff --git a/ServiceBinding/RpcLiteralRequestHeaderMessageBinder.php b/ServiceBinding/RpcLiteralRequestHeaderMessageBinder.php new file mode 100644 index 0000000..15fcf0c --- /dev/null +++ b/ServiceBinding/RpcLiteralRequestHeaderMessageBinder.php @@ -0,0 +1,33 @@ + + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace BeSimple\SoapBundle\ServiceBinding; + +use BeSimple\SoapBundle\ServiceDefinition\Method; + +/** + * @author Francis Besset + */ +class RpcLiteralRequestHeaderMessageBinder extends RpcLiteralRequestMessageBinder +{ + private $header; + + public function setHeader($header) + { + $this->header = $header; + } + + public function processMessage(Method $messageDefinition, $message, array $definitionComplexTypes = array()) + { + $headerDefinition = $messageDefinition->getHeaders()->get($this->header); + + return $this->processType($headerDefinition->getType()->getPhpType(), $message, $definitionComplexTypes); + } +} \ No newline at end of file diff --git a/ServiceBinding/RpcLiteralRequestMessageBinder.php b/ServiceBinding/RpcLiteralRequestMessageBinder.php index 2d3c32d..58ac675 100644 --- a/ServiceBinding/RpcLiteralRequestMessageBinder.php +++ b/ServiceBinding/RpcLiteralRequestMessageBinder.php @@ -38,7 +38,7 @@ class RpcLiteralRequestMessageBinder implements MessageBinderInterface return $result; } - private function processType($phpType, $message, array $definitionComplexTypes) + protected function processType($phpType, $message, array $definitionComplexTypes) { if (preg_match('/^([^\[]+)\[\]$/', $phpType, $match)) { $isArray = true; diff --git a/ServiceBinding/ServiceBinder.php b/ServiceBinding/ServiceBinder.php index e359c55..01c4ebd 100644 --- a/ServiceBinding/ServiceBinder.php +++ b/ServiceBinding/ServiceBinder.php @@ -25,6 +25,11 @@ class ServiceBinder */ private $definition; + /** + * @var \BeSimple\SoapBundle\ServiceBinding\MessageBinderInterface + */ + private $requestHeaderMessageBinder; + /** * @var \BeSimple\SoapBundle\ServiceBinding\MessageBinderInterface */ @@ -35,32 +40,39 @@ class ServiceBinder */ private $responseMessageBinder; - public function __construct(ServiceDefinition $definition, MessageBinderInterface $requestMessageBinder, MessageBinderInterface $responseMessageBinder) { - $this->definition = $definition; - $this->requestMessageBinder = $requestMessageBinder; + public function __construct(ServiceDefinition $definition, MessageBinderInterface $requestHeaderMessageBinder, MessageBinderInterface $requestMessageBinder, MessageBinderInterface $responseMessageBinder) { + $this->definition = $definition; + + $this->requestHeaderMessageBinder = $requestHeaderMessageBinder; + $this->requestMessageBinder = $requestMessageBinder; + $this->responseMessageBinder = $responseMessageBinder; } - public function isServiceHeader($name) + public function isServiceHeader($method, $header) { - return $this->definition->getHeaders()->has($name); + return $this->definition->getMethods()->get($method)->getHeaders()->has($header); } - public function isServiceMethod($name) + public function isServiceMethod($method) { - return $this->definition->getMethods()->has($name); + return $this->definition->getMethods()->has($method); } - public function processServiceHeader($name, $data) + public function processServiceHeader($method, $header, $data) { - $headerDefinition = $this->definition->getHeaders()->get($name); + $methodDefinition = $this->definition->getMethods()->get($method); + $headerDefinition = $methodDefinition->getHeaders()->get($header); + + $this->requestHeaderMessageBinder->setHeader($header); + $data = $this->requestHeaderMessageBinder->processMessage($methodDefinition, $data, $this->definition->getDefinitionComplexTypes()); return $this->createSoapHeader($headerDefinition, $data); } - public function processServiceMethodArguments($name, $arguments) + public function processServiceMethodArguments($method, $arguments) { - $methodDefinition = $this->definition->getMethods()->get($name); + $methodDefinition = $this->definition->getMethods()->get($method); return array_merge( array('_controller' => $methodDefinition->getController()), @@ -79,6 +91,6 @@ class ServiceBinder { $qname = QName::fromPackedQName($headerDefinition->getType()->getXmlType()); - return new SoapHeader($qname->getNamespace(), $qname->getName(), $data); + return new SoapHeader($qname->getNamespace(), $headerDefinition->getName(), $data); } } \ No newline at end of file diff --git a/ServiceDefinition/Annotation/Header.php b/ServiceDefinition/Annotation/Header.php new file mode 100644 index 0000000..f6ed406 --- /dev/null +++ b/ServiceDefinition/Annotation/Header.php @@ -0,0 +1,22 @@ + + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace BeSimple\SoapBundle\ServiceDefinition\Annotation; + +/** + * @Annotation + */ +class Header extends Param +{ + public function getAliasName() + { + return 'header'; + } +} \ No newline at end of file diff --git a/ServiceDefinition/Dumper/Wsdl.php b/ServiceDefinition/Dumper/Wsdl.php new file mode 100644 index 0000000..4410f9a --- /dev/null +++ b/ServiceDefinition/Dumper/Wsdl.php @@ -0,0 +1,37 @@ + + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace BeSimple\SoapBundle\ServiceDefinition\Dumper; + +use Zend\Soap\Wsdl as BaseWsdl; + +/** + * @author Francis Besset + */ +class Wsdl extends BaseWsdl +{ + public function addBindingOperationHeader(\DOMElement $bindingOperation, array $headers, array $baseBinding) + { + foreach ($headers as $header) { + $inputNode = $bindingOperation->getElementsByTagName('input')->item(0); + + $headerNode = $this->toDomDocument()->createElement('soap:header'); + $headerNode->setAttribute('part', $header); + + foreach ($baseBinding as $name => $value) { + $headerNode->setAttribute($name, $value); + } + + $inputNode->appendChild($headerNode); + } + + return $bindingOperation; + } +} \ No newline at end of file diff --git a/ServiceDefinition/Dumper/WsdlDumper.php b/ServiceDefinition/Dumper/WsdlDumper.php index 7c07064..8ac4d87 100644 --- a/ServiceDefinition/Dumper/WsdlDumper.php +++ b/ServiceDefinition/Dumper/WsdlDumper.php @@ -17,8 +17,6 @@ use BeSimple\SoapBundle\ServiceDefinition\Loader\AnnotationComplexTypeLoader; use BeSimple\SoapBundle\Util\Assert; use BeSimple\SoapBundle\Util\QName; -use Zend\Soap\Wsdl; - /** * @author Christian Kerl */ @@ -48,8 +46,13 @@ class WsdlDumper implements DumperInterface $this->wsdl->addService($this->getServiceName(), $this->getPortName(), $this->qualify($this->getBindingName()), $options['endpoint']); foreach ($definition->getMethods() as $method) { - $requestParts = array(); - $responseParts = array(); + $requestHeaderParts = + $requestParts = + $responseParts = array(); + + foreach ($method->getHeaders() as $header) { + $requestHeaderParts[$header->getName()] = $this->wsdl->getType($header->getType()->getPhpType()); + } foreach ($method->getArguments() as $argument) { $requestParts[$argument->getName()] = $this->wsdl->getType($argument->getType()->getPhpType()); @@ -59,26 +62,38 @@ class WsdlDumper implements DumperInterface $responseParts['return'] = $this->wsdl->getType($method->getReturn()->getPhpType()); } + if (!empty($requestHeaderParts)) { + $this->wsdl->addMessage($this->getRequestHeaderMessageName($method), $requestHeaderParts); + } $this->wsdl->addMessage($this->getRequestMessageName($method), $requestParts); $this->wsdl->addMessage($this->getResponseMessageName($method), $responseParts); - $portOperation = $this->wsdl->addPortOperation($port, $method->getName(), $this->qualify($this->getRequestMessageName($method)), $this->qualify($this->getResponseMessageName($method))); + $portOperation = $this->wsdl->addPortOperation( + $port, + $method->getName(), + $this->qualify($this->getRequestMessageName($method)), + $this->qualify($this->getResponseMessageName($method)) + ); $portOperation->setAttribute('parameterOrder', implode(' ', array_keys($requestParts))); - $bindingInput = array( - 'parts' => implode(' ', array_keys($requestParts)), - 'use' => 'literal', - 'namespace' => $definition->getNamespace(), - 'encodingStyle' => 'http://schemas.xmlsoap.org/soap/encoding/', - ); - $bindingOutput = array( - 'parts' => implode(' ', array_keys($responseParts)), + $baseBinding = array( 'use' => 'literal', 'namespace' => $definition->getNamespace(), 'encodingStyle' => 'http://schemas.xmlsoap.org/soap/encoding/', ); - $bindingOperation = $this->wsdl->addBindingOperation($binding, $method->getName(), $bindingInput, $bindingOutput); + $bindingOperation = $this->wsdl->addBindingOperation( + $binding, + $method->getName(), + array_merge(array('parts' => implode(' ', array_keys($requestParts))), $baseBinding), + array_merge(array('parts' => implode(' ', array_keys($responseParts))), $baseBinding) + ); + $bindingOperation = $this->wsdl->addBindingOperationHeader( + $bindingOperation, + array_keys($requestHeaderParts), + array_merge(array('message' => $this->qualify($this->getRequestHeaderMessageName($method))), $baseBinding) + ); + $this->wsdl->addSoapOperation($bindingOperation, $this->getSoapOperationName($method)); } @@ -125,6 +140,11 @@ class WsdlDumper implements DumperInterface return $this->definition->getName().'Service'; } + protected function getRequestHeaderMessageName(Method $method) + { + return $method->getName().'Header'; + } + protected function getRequestMessageName(Method $method) { return $method->getName().'Request'; diff --git a/ServiceDefinition/Dumper/WsdlTypeStrategy.php b/ServiceDefinition/Dumper/WsdlTypeStrategy.php index 77aa131..62610e8 100644 --- a/ServiceDefinition/Dumper/WsdlTypeStrategy.php +++ b/ServiceDefinition/Dumper/WsdlTypeStrategy.php @@ -16,7 +16,7 @@ use BeSimple\SoapBundle\ServiceDefinition\Strategy\ComplexType; use BeSimple\SoapBundle\Util\String; use Zend\Soap\Exception; -use Zend\Soap\Wsdl; +use Zend\Soap\Wsdl as BaseWsdl; use Zend\Soap\Wsdl\Strategy; use Zend\Soap\Wsdl\Strategy\ArrayOfTypeSequence; @@ -46,7 +46,7 @@ class WsdlTypeStrategy implements Strategy * * @param \Zend\Soap\Wsdl $context */ - public function setContext(Wsdl $context) + public function setContext(BaseWsdl $context) { $this->context = $context; diff --git a/ServiceDefinition/Loader/AnnotationClassLoader.php b/ServiceDefinition/Loader/AnnotationClassLoader.php index b71732f..190e362 100644 --- a/ServiceDefinition/Loader/AnnotationClassLoader.php +++ b/ServiceDefinition/Loader/AnnotationClassLoader.php @@ -10,13 +10,8 @@ namespace BeSimple\SoapBundle\ServiceDefinition\Loader; -use BeSimple\SoapBundle\ServiceDefinition\Argument; -use BeSimple\SoapBundle\ServiceDefinition\Method; -use BeSimple\SoapBundle\ServiceDefinition\Type; -use BeSimple\SoapBundle\ServiceDefinition\ServiceDefinition; -use BeSimple\SoapBundle\ServiceDefinition\Annotation\Method as MethodAnnotation; -use BeSimple\SoapBundle\ServiceDefinition\Annotation\Param as ParamAnnotation; -use BeSimple\SoapBundle\ServiceDefinition\Annotation\Result as ResultAnnotation; +use BeSimple\SoapBundle\ServiceDefinition as Definition; +use BeSimple\SoapBundle\ServiceDefinition\Annotation; use Doctrine\Common\Annotations\Reader; @@ -50,7 +45,7 @@ class AnnotationClassLoader implements LoaderInterface * @param string $class A class name * @param string $type The resource type * - * @return ServiceDefinition A ServiceDefinition instance + * @return \BeSimple\SoapBundle\ServiceDefinition\ServiceDefinition A ServiceDefinition instance * * @throws \InvalidArgumentException When route can't be parsed */ @@ -61,48 +56,57 @@ class AnnotationClassLoader implements LoaderInterface } $class = new \ReflectionClass($class); - $definition = new ServiceDefinition(); + $definition = new Definition\ServiceDefinition(); foreach ($class->getMethods() as $method) { - $serviceArguments = array(); + $serviceArguments = + $serviceHeaders = array(); $serviceMethod = $serviceReturn = null; foreach ($this->reader->getMethodAnnotations($method) as $i => $annotation) { - if ($annotation instanceof ParamAnnotation) { - $serviceArguments[] = new Argument( + if ($annotation instanceof Annotation\Header) { + $serviceHeaders[] = new Definition\Header( $annotation->getValue(), $this->getArgumentType($method, $annotation) ); - } elseif ($annotation instanceof MethodAnnotation) { + } elseif ($annotation instanceof Annotation\Param) { + $serviceArguments[] = new Definition\Argument( + $annotation->getValue(), + $this->getArgumentType($method, $annotation) + ); + } elseif ($annotation instanceof Annotation\Method) { if ($serviceMethod) { - throw new \LogicException(sprintf('@Method defined twice for "%s".', $method->getName())); + throw new \LogicException(sprintf('@Soap\Method defined twice for "%s".', $method->getName())); } - $serviceMethod = new Method( + $serviceMethod = new Definition\Method( $annotation->getValue(), $this->getController($method, $annotation) ); - } elseif ($annotation instanceof ResultAnnotation) { + } elseif ($annotation instanceof Annotation\Result) { if ($serviceReturn) { - throw new \LogicException(sprintf('@Result defined twice for "%s".', $method->getName())); + throw new \LogicException(sprintf('@Soap\Result defined twice for "%s".', $method->getName())); } - $serviceReturn = new Type($annotation->getPhpType(), $annotation->getXmlType()); + $serviceReturn = new Definition\Type($annotation->getPhpType(), $annotation->getXmlType()); } } if (!$serviceMethod && (!empty($serviceArguments) || $serviceReturn)) { - throw new \LogicException(sprintf('@Method non-existent for "%s".', $method->getName())); + throw new \LogicException(sprintf('@Soap\Method non-existent for "%s".', $method->getName())); } if ($serviceMethod) { $serviceMethod->setArguments($serviceArguments); + $serviceMethod->setHeaders($serviceHeaders); - if ($serviceReturn) { - $serviceMethod->setReturn($serviceReturn); + if (!$serviceReturn) { + throw new \LogicException(sprintf('@Soap\Result non-existent for "%s".', $method->getName())); } + $serviceMethod->setReturn($serviceReturn); + $definition->getMethods()->add($serviceMethod); } } @@ -110,7 +114,13 @@ class AnnotationClassLoader implements LoaderInterface return $definition; } - private function getController(\ReflectionMethod $method, MethodAnnotation $annotation) + /** + * @param \ReflectionMethod $method + * @param \BeSimple\SoapBundle\ServiceDefinition\Annotation\Method $annotation + * + * @return string + */ + private function getController(\ReflectionMethod $method, Annotation\Method $annotation) { if(null !== $annotation->getService()) { return $annotation->getService() . ':' . $method->name; @@ -121,11 +131,11 @@ class AnnotationClassLoader implements LoaderInterface /** * @param \ReflectionMethod $method - * @param ParamAnnotation $annotation + * @param \BeSimple\SoapBundle\ServiceDefinition\Annotation\Param $annotation * * @return \BeSimple\SoapBundle\ServiceDefinition\Type */ - private function getArgumentType(\ReflectionMethod $method, ParamAnnotation $annotation) + private function getArgumentType(\ReflectionMethod $method, Annotation\Param $annotation) { $phpType = $annotation->getPhpType(); $xmlType = $annotation->getXmlType(); @@ -140,7 +150,7 @@ class AnnotationClassLoader implements LoaderInterface } } - return new Type($phpType, $xmlType); + return new Definition\Type($phpType, $xmlType); } /** diff --git a/ServiceDefinition/Method.php b/ServiceDefinition/Method.php index 14e1efa..a03053f 100644 --- a/ServiceDefinition/Method.php +++ b/ServiceDefinition/Method.php @@ -17,12 +17,14 @@ class Method private $name; private $controller; private $arguments; + private $headers; private $return; - public function __construct($name = null, $controller = null, array $arguments = array(), Type $return = null) + public function __construct($name = null, $controller = null, array $headers = array(), array $arguments = array(), Type $return = null) { $this->setName($name); $this->setController($controller); + $this->setHeaders($headers); $this->setArguments($arguments); if ($return) { @@ -50,6 +52,17 @@ class Method $this->controller = $controller; } + public function getHeaders() + { + return $this->headers; + } + + public function setHeaders(array $headers) + { + $this->headers = new Collection('getName', 'BeSimple\SoapBundle\ServiceDefinition\Header'); + $this->headers->addAll($headers); + } + public function getArguments() { return $this->arguments; diff --git a/ServiceDefinition/ServiceDefinition.php b/ServiceDefinition/ServiceDefinition.php index 683de74..adfd50b 100644 --- a/ServiceDefinition/ServiceDefinition.php +++ b/ServiceDefinition/ServiceDefinition.php @@ -29,23 +29,16 @@ class ServiceDefinition */ private $methods; - /** - * @var \BeSimple\SoapBundle\Util\Collection - */ - private $headers; - private $complexTypes = array(); - public function __construct($name = null, $namespace = null, array $methods = array(), array $headers = array()) + public function __construct($name = null, $namespace = null, array $methods = array()) { $this->setName($name); $this->setNamespace($namespace); $this->methods = new Collection('getName', 'BeSimple\SoapBundle\ServiceDefinition\Method'); - $this->headers = new Collection('getName', 'BeSimple\SoapBundle\ServiceDefinition\Header'); $this->setMethods($methods); - $this->setHeaders($headers); } /** @@ -96,22 +89,6 @@ class ServiceDefinition $this->methods->addAll($methods); } - /** - * @return \BeSimple\SoapBundle\Util\Collection - */ - public function getHeaders() - { - return $this->headers; - } - - /** - * @param array $headers - */ - public function setHeaders(array $headers) - { - $this->headers->addAll($headers); - } - /** * @return array */ @@ -119,11 +96,15 @@ class ServiceDefinition { $types = array(); - foreach($this->methods as $method) { - foreach($method->getArguments() as $argument) { + foreach ($this->methods as $method) { + foreach ($method->getArguments() as $argument) { $types[] = $argument->getType(); } + foreach ($method->getHeaders() as $header) { + $types[] = $header->getType(); + } + $types[] = $method->getReturn(); } diff --git a/WebServiceContext.php b/WebServiceContext.php index f0acaf6..c676a45 100644 --- a/WebServiceContext.php +++ b/WebServiceContext.php @@ -27,6 +27,7 @@ use Symfony\Component\Config\Loader\LoaderInterface; */ class WebServiceContext { + private $requestHeaderMessageBinder; private $requestMessageBinder; private $responseMessageBinder; private $typeRepository; @@ -40,12 +41,13 @@ class WebServiceContext private $serviceBinder; private $serverFactory; - public function __construct(LoaderInterface $loader, DumperInterface $dumper, MessageBinderInterface $requestMessageBinder, MessageBinderInterface $responseMessageBinder, TypeRepository $typeRepository, ConverterRepository $converterRepository, array $options) { + public function __construct(LoaderInterface $loader, DumperInterface $dumper, MessageBinderInterface $requestHeaderMessageBinder, MessageBinderInterface $requestMessageBinder, MessageBinderInterface $responseMessageBinder, TypeRepository $typeRepository, ConverterRepository $converterRepository, array $options) { $this->loader = $loader; $this->wsdlFileDumper = $dumper; - $this->requestMessageBinder = $requestMessageBinder; - $this->responseMessageBinder = $responseMessageBinder; + $this->requestHeaderMessageBinder = $requestHeaderMessageBinder; + $this->requestMessageBinder = $requestMessageBinder; + $this->responseMessageBinder = $responseMessageBinder; $this->typeRepository = $typeRepository; $this->converterRepository = $converterRepository; @@ -90,7 +92,7 @@ class WebServiceContext public function getServiceBinder() { if (null === $this->serviceBinder) { - $this->serviceBinder = new ServiceBinder($this->getServiceDefinition(), $this->requestMessageBinder, $this->responseMessageBinder); + $this->serviceBinder = new ServiceBinder($this->getServiceDefinition(), $this->requestHeaderMessageBinder, $this->requestMessageBinder, $this->responseMessageBinder); } return $this->serviceBinder;