Added headers in request

You can add @Soap\Header("foobar", phpType="string") in a method definition
This commit is contained in:
Francis Besset 2011-08-14 18:00:28 +02:00
parent a6f8ccbfd2
commit c5902122bb
14 changed files with 256 additions and 112 deletions

View File

@ -43,6 +43,11 @@ class SoapWebServiceController extends ContainerAware
*/ */
protected $serviceBinder; protected $serviceBinder;
/**
* @var array
*/
private $headers = array();
/** /**
* @return \BeSimple\SoapBundle\Soap\SoapResponse * @return \BeSimple\SoapBundle\Soap\SoapResponse
*/ */
@ -96,12 +101,14 @@ class SoapWebServiceController extends ContainerAware
*/ */
public function __call($method, $arguments) public function __call($method, $arguments)
{ {
if ($this->serviceBinder->isServiceHeader($method)) { if ($this->serviceBinder->isServiceMethod($method)) {
// collect request soap headers foreach ($this->headers as $name => $value) {
$this->soapRequest->getSoapHeaders()->add( if ($this->serviceBinder->isServiceHeader($method, $name)) {
$this->serviceBinder->processServiceHeader($method, $arguments[0]) $this->soapRequest->getSoapHeaders()->add($this->serviceBinder->processServiceHeader($method, $name, $value));
); }
} elseif ($this->serviceBinder->isServiceMethod($method)) { }
$this->headers = null;
$this->soapRequest->attributes->add( $this->soapRequest->attributes->add(
$this->serviceBinder->processServiceMethodArguments($method, $arguments) $this->serviceBinder->processServiceMethodArguments($method, $arguments)
); );
@ -127,9 +134,28 @@ class SoapWebServiceController extends ContainerAware
$method, $method,
$this->soapResponse->getReturnValue() $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. * Checks that the given Response is a SoapResponse.
* *
@ -148,28 +174,12 @@ class SoapWebServiceController extends ContainerAware
return $response; 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) 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)); throw new NotFoundHttpException(sprintf('No webservice with name "%s" found.', $webservice));
} }
return $this->container->get('besimple.soap.context.'.$webservice); return $this->container->get('besimple.soap.context.'.$webservice);
} }
} }

View File

@ -28,7 +28,7 @@ class BeSimpleSoapExtension extends Extension
// maps config options to service suffix // maps config options to service suffix
private $bindingConfigToServiceSuffixMap = array( private $bindingConfigToServiceSuffixMap = array(
'rpc-literal' => 'rpcliteral', 'rpc-literal' => 'rpcliteral',
'document-wrapped' => 'documentwrapped' 'document-wrapped' => 'documentwrapped',
); );
public function load(array $configs, ContainerBuilder $container) public function load(array $configs, ContainerBuilder $container)
@ -60,8 +60,8 @@ class BeSimpleSoapExtension extends Extension
$options = $container $options = $container
->getDefinition('besimple.soap.context.'.$bindingSuffix) ->getDefinition('besimple.soap.context.'.$bindingSuffix)
->getArgument(6); ->getArgument(7);
$definition->replaceArgument(6, array_merge($options, $config)); $definition->replaceArgument(7, array_merge($options, $config));
} }
} }

View File

@ -6,6 +6,7 @@
<parameters> <parameters>
<parameter key="besimple.soap.context.class">BeSimple\SoapBundle\WebServiceContext</parameter> <parameter key="besimple.soap.context.class">BeSimple\SoapBundle\WebServiceContext</parameter>
<parameter key="besimple.soap.cache_dir">%kernel.cache_dir%/webservice</parameter> <parameter key="besimple.soap.cache_dir">%kernel.cache_dir%/webservice</parameter>
<parameter key="besimple.soap.binder.request.header.rpcliteral.class">BeSimple\SoapBundle\ServiceBinding\RpcLiteralRequestHeaderMessageBinder</parameter>
<parameter key="besimple.soap.binder.request.rpcliteral.class">BeSimple\SoapBundle\ServiceBinding\RpcLiteralRequestMessageBinder</parameter> <parameter key="besimple.soap.binder.request.rpcliteral.class">BeSimple\SoapBundle\ServiceBinding\RpcLiteralRequestMessageBinder</parameter>
<parameter key="besimple.soap.binder.response.rpcliteral.class">BeSimple\SoapBundle\ServiceBinding\RpcLiteralResponseMessageBinder</parameter> <parameter key="besimple.soap.binder.response.rpcliteral.class">BeSimple\SoapBundle\ServiceBinding\RpcLiteralResponseMessageBinder</parameter>
<parameter key="besimple.soap.binder.request.documentwrapped.class">BeSimple\SoapBundle\ServiceBinding\DocumentLiteralWrappedRequestMessageBinder</parameter> <parameter key="besimple.soap.binder.request.documentwrapped.class">BeSimple\SoapBundle\ServiceBinding\DocumentLiteralWrappedRequestMessageBinder</parameter>
@ -19,6 +20,7 @@
<service id="besimple.soap.context.rpcliteral" class="%besimple.soap.context.class%" abstract="true"> <service id="besimple.soap.context.rpcliteral" class="%besimple.soap.context.class%" abstract="true">
<argument type="service" id="besimple.soap.definition.loader" /> <argument type="service" id="besimple.soap.definition.loader" />
<argument type="service" id="besimple.soap.definition.dumper.wsdl.rpcliteral" /> <argument type="service" id="besimple.soap.definition.dumper.wsdl.rpcliteral" />
<argument type="service" id="besimple.soap.binder.request.header.rpcliteral" />
<argument type="service" id="besimple.soap.binder.request.rpcliteral" /> <argument type="service" id="besimple.soap.binder.request.rpcliteral" />
<argument type="service" id="besimple.soap.binder.response.rpcliteral" /> <argument type="service" id="besimple.soap.binder.response.rpcliteral" />
<argument type="service" id="besimple.soap.type.repository" /> <argument type="service" id="besimple.soap.type.repository" />
@ -32,6 +34,7 @@
<service id="besimple.soap.context.documentwrapped" class="%besimple.soap.context.class%" abstract="true"> <service id="besimple.soap.context.documentwrapped" class="%besimple.soap.context.class%" abstract="true">
<argument type="service" id="besimple.soap.definition.loader" /> <argument type="service" id="besimple.soap.definition.loader" />
<argument type="service" id="besimple.soap.definition.dumper.wsdl.documentwrapped" /> <argument type="service" id="besimple.soap.definition.dumper.wsdl.documentwrapped" />
<argument type="service" id="besimple.soap.binder.request.header.documentwrapped" />
<argument type="service" id="besimple.soap.binder.request.documentwrapped" /> <argument type="service" id="besimple.soap.binder.request.documentwrapped" />
<argument type="service" id="besimple.soap.binder.response.documentwrapped" /> <argument type="service" id="besimple.soap.binder.response.documentwrapped" />
<argument type="service" id="besimple.soap.type.repository" /> <argument type="service" id="besimple.soap.type.repository" />
@ -42,6 +45,7 @@
</argument> </argument>
</service> </service>
<service id="besimple.soap.binder.request.header.rpcliteral" class="%besimple.soap.binder.request.header.rpcliteral.class%" />
<service id="besimple.soap.binder.request.rpcliteral" class="%besimple.soap.binder.request.rpcliteral.class%" /> <service id="besimple.soap.binder.request.rpcliteral" class="%besimple.soap.binder.request.rpcliteral.class%" />
<service id="besimple.soap.binder.response.rpcliteral" class="%besimple.soap.binder.response.rpcliteral.class%" /> <service id="besimple.soap.binder.response.rpcliteral" class="%besimple.soap.binder.response.rpcliteral.class%" />

View File

@ -0,0 +1,33 @@
<?php
/*
* This file is part of the BeSimpleSoapBundle.
*
* (c) Christian Kerl <christian-kerl@web.de>
*
* 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 <francis.besset@gmail.com>
*/
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);
}
}

View File

@ -38,7 +38,7 @@ class RpcLiteralRequestMessageBinder implements MessageBinderInterface
return $result; return $result;
} }
private function processType($phpType, $message, array $definitionComplexTypes) protected function processType($phpType, $message, array $definitionComplexTypes)
{ {
if (preg_match('/^([^\[]+)\[\]$/', $phpType, $match)) { if (preg_match('/^([^\[]+)\[\]$/', $phpType, $match)) {
$isArray = true; $isArray = true;

View File

@ -25,6 +25,11 @@ class ServiceBinder
*/ */
private $definition; private $definition;
/**
* @var \BeSimple\SoapBundle\ServiceBinding\MessageBinderInterface
*/
private $requestHeaderMessageBinder;
/** /**
* @var \BeSimple\SoapBundle\ServiceBinding\MessageBinderInterface * @var \BeSimple\SoapBundle\ServiceBinding\MessageBinderInterface
*/ */
@ -35,32 +40,39 @@ class ServiceBinder
*/ */
private $responseMessageBinder; private $responseMessageBinder;
public function __construct(ServiceDefinition $definition, MessageBinderInterface $requestMessageBinder, MessageBinderInterface $responseMessageBinder) { public function __construct(ServiceDefinition $definition, MessageBinderInterface $requestHeaderMessageBinder, MessageBinderInterface $requestMessageBinder, MessageBinderInterface $responseMessageBinder) {
$this->definition = $definition; $this->definition = $definition;
$this->requestMessageBinder = $requestMessageBinder;
$this->requestHeaderMessageBinder = $requestHeaderMessageBinder;
$this->requestMessageBinder = $requestMessageBinder;
$this->responseMessageBinder = $responseMessageBinder; $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); 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( return array_merge(
array('_controller' => $methodDefinition->getController()), array('_controller' => $methodDefinition->getController()),
@ -79,6 +91,6 @@ class ServiceBinder
{ {
$qname = QName::fromPackedQName($headerDefinition->getType()->getXmlType()); $qname = QName::fromPackedQName($headerDefinition->getType()->getXmlType());
return new SoapHeader($qname->getNamespace(), $qname->getName(), $data); return new SoapHeader($qname->getNamespace(), $headerDefinition->getName(), $data);
} }
} }

View File

@ -0,0 +1,22 @@
<?php
/*
* This file is part of the BeSimpleSoapBundle.
*
* (c) Christian Kerl <christian-kerl@web.de>
*
* 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';
}
}

View File

@ -0,0 +1,37 @@
<?php
/*
* This file is part of the BeSimpleSoapBundle.
*
* (c) Christian Kerl <christian-kerl@web.de>
*
* 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 <francis.besset@gmail.com>
*/
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;
}
}

View File

@ -17,8 +17,6 @@ use BeSimple\SoapBundle\ServiceDefinition\Loader\AnnotationComplexTypeLoader;
use BeSimple\SoapBundle\Util\Assert; use BeSimple\SoapBundle\Util\Assert;
use BeSimple\SoapBundle\Util\QName; use BeSimple\SoapBundle\Util\QName;
use Zend\Soap\Wsdl;
/** /**
* @author Christian Kerl <christian-kerl@web.de> * @author Christian Kerl <christian-kerl@web.de>
*/ */
@ -48,8 +46,13 @@ class WsdlDumper implements DumperInterface
$this->wsdl->addService($this->getServiceName(), $this->getPortName(), $this->qualify($this->getBindingName()), $options['endpoint']); $this->wsdl->addService($this->getServiceName(), $this->getPortName(), $this->qualify($this->getBindingName()), $options['endpoint']);
foreach ($definition->getMethods() as $method) { foreach ($definition->getMethods() as $method) {
$requestParts = array(); $requestHeaderParts =
$responseParts = array(); $requestParts =
$responseParts = array();
foreach ($method->getHeaders() as $header) {
$requestHeaderParts[$header->getName()] = $this->wsdl->getType($header->getType()->getPhpType());
}
foreach ($method->getArguments() as $argument) { foreach ($method->getArguments() as $argument) {
$requestParts[$argument->getName()] = $this->wsdl->getType($argument->getType()->getPhpType()); $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()); $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->getRequestMessageName($method), $requestParts);
$this->wsdl->addMessage($this->getResponseMessageName($method), $responseParts); $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))); $portOperation->setAttribute('parameterOrder', implode(' ', array_keys($requestParts)));
$bindingInput = array( $baseBinding = 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)),
'use' => 'literal', 'use' => 'literal',
'namespace' => $definition->getNamespace(), 'namespace' => $definition->getNamespace(),
'encodingStyle' => 'http://schemas.xmlsoap.org/soap/encoding/', '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)); $this->wsdl->addSoapOperation($bindingOperation, $this->getSoapOperationName($method));
} }
@ -125,6 +140,11 @@ class WsdlDumper implements DumperInterface
return $this->definition->getName().'Service'; return $this->definition->getName().'Service';
} }
protected function getRequestHeaderMessageName(Method $method)
{
return $method->getName().'Header';
}
protected function getRequestMessageName(Method $method) protected function getRequestMessageName(Method $method)
{ {
return $method->getName().'Request'; return $method->getName().'Request';

View File

@ -16,7 +16,7 @@ use BeSimple\SoapBundle\ServiceDefinition\Strategy\ComplexType;
use BeSimple\SoapBundle\Util\String; use BeSimple\SoapBundle\Util\String;
use Zend\Soap\Exception; use Zend\Soap\Exception;
use Zend\Soap\Wsdl; use Zend\Soap\Wsdl as BaseWsdl;
use Zend\Soap\Wsdl\Strategy; use Zend\Soap\Wsdl\Strategy;
use Zend\Soap\Wsdl\Strategy\ArrayOfTypeSequence; use Zend\Soap\Wsdl\Strategy\ArrayOfTypeSequence;
@ -46,7 +46,7 @@ class WsdlTypeStrategy implements Strategy
* *
* @param \Zend\Soap\Wsdl $context * @param \Zend\Soap\Wsdl $context
*/ */
public function setContext(Wsdl $context) public function setContext(BaseWsdl $context)
{ {
$this->context = $context; $this->context = $context;

View File

@ -10,13 +10,8 @@
namespace BeSimple\SoapBundle\ServiceDefinition\Loader; namespace BeSimple\SoapBundle\ServiceDefinition\Loader;
use BeSimple\SoapBundle\ServiceDefinition\Argument; use BeSimple\SoapBundle\ServiceDefinition as Definition;
use BeSimple\SoapBundle\ServiceDefinition\Method; use BeSimple\SoapBundle\ServiceDefinition\Annotation;
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 Doctrine\Common\Annotations\Reader; use Doctrine\Common\Annotations\Reader;
@ -50,7 +45,7 @@ class AnnotationClassLoader implements LoaderInterface
* @param string $class A class name * @param string $class A class name
* @param string $type The resource type * @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 * @throws \InvalidArgumentException When route can't be parsed
*/ */
@ -61,48 +56,57 @@ class AnnotationClassLoader implements LoaderInterface
} }
$class = new \ReflectionClass($class); $class = new \ReflectionClass($class);
$definition = new ServiceDefinition(); $definition = new Definition\ServiceDefinition();
foreach ($class->getMethods() as $method) { foreach ($class->getMethods() as $method) {
$serviceArguments = array(); $serviceArguments =
$serviceHeaders = array();
$serviceMethod = $serviceMethod =
$serviceReturn = null; $serviceReturn = null;
foreach ($this->reader->getMethodAnnotations($method) as $i => $annotation) { foreach ($this->reader->getMethodAnnotations($method) as $i => $annotation) {
if ($annotation instanceof ParamAnnotation) { if ($annotation instanceof Annotation\Header) {
$serviceArguments[] = new Argument( $serviceHeaders[] = new Definition\Header(
$annotation->getValue(), $annotation->getValue(),
$this->getArgumentType($method, $annotation) $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) { 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(), $annotation->getValue(),
$this->getController($method, $annotation) $this->getController($method, $annotation)
); );
} elseif ($annotation instanceof ResultAnnotation) { } elseif ($annotation instanceof Annotation\Result) {
if ($serviceReturn) { 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)) { 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) { if ($serviceMethod) {
$serviceMethod->setArguments($serviceArguments); $serviceMethod->setArguments($serviceArguments);
$serviceMethod->setHeaders($serviceHeaders);
if ($serviceReturn) { if (!$serviceReturn) {
$serviceMethod->setReturn($serviceReturn); throw new \LogicException(sprintf('@Soap\Result non-existent for "%s".', $method->getName()));
} }
$serviceMethod->setReturn($serviceReturn);
$definition->getMethods()->add($serviceMethod); $definition->getMethods()->add($serviceMethod);
} }
} }
@ -110,7 +114,13 @@ class AnnotationClassLoader implements LoaderInterface
return $definition; 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()) { if(null !== $annotation->getService()) {
return $annotation->getService() . ':' . $method->name; return $annotation->getService() . ':' . $method->name;
@ -121,11 +131,11 @@ class AnnotationClassLoader implements LoaderInterface
/** /**
* @param \ReflectionMethod $method * @param \ReflectionMethod $method
* @param ParamAnnotation $annotation * @param \BeSimple\SoapBundle\ServiceDefinition\Annotation\Param $annotation
* *
* @return \BeSimple\SoapBundle\ServiceDefinition\Type * @return \BeSimple\SoapBundle\ServiceDefinition\Type
*/ */
private function getArgumentType(\ReflectionMethod $method, ParamAnnotation $annotation) private function getArgumentType(\ReflectionMethod $method, Annotation\Param $annotation)
{ {
$phpType = $annotation->getPhpType(); $phpType = $annotation->getPhpType();
$xmlType = $annotation->getXmlType(); $xmlType = $annotation->getXmlType();
@ -140,7 +150,7 @@ class AnnotationClassLoader implements LoaderInterface
} }
} }
return new Type($phpType, $xmlType); return new Definition\Type($phpType, $xmlType);
} }
/** /**

View File

@ -17,12 +17,14 @@ class Method
private $name; private $name;
private $controller; private $controller;
private $arguments; private $arguments;
private $headers;
private $return; 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->setName($name);
$this->setController($controller); $this->setController($controller);
$this->setHeaders($headers);
$this->setArguments($arguments); $this->setArguments($arguments);
if ($return) { if ($return) {
@ -50,6 +52,17 @@ class Method
$this->controller = $controller; $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() public function getArguments()
{ {
return $this->arguments; return $this->arguments;

View File

@ -29,23 +29,16 @@ class ServiceDefinition
*/ */
private $methods; private $methods;
/**
* @var \BeSimple\SoapBundle\Util\Collection
*/
private $headers;
private $complexTypes = array(); 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->setName($name);
$this->setNamespace($namespace); $this->setNamespace($namespace);
$this->methods = new Collection('getName', 'BeSimple\SoapBundle\ServiceDefinition\Method'); $this->methods = new Collection('getName', 'BeSimple\SoapBundle\ServiceDefinition\Method');
$this->headers = new Collection('getName', 'BeSimple\SoapBundle\ServiceDefinition\Header');
$this->setMethods($methods); $this->setMethods($methods);
$this->setHeaders($headers);
} }
/** /**
@ -96,22 +89,6 @@ class ServiceDefinition
$this->methods->addAll($methods); $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 * @return array
*/ */
@ -119,11 +96,15 @@ class ServiceDefinition
{ {
$types = array(); $types = array();
foreach($this->methods as $method) { foreach ($this->methods as $method) {
foreach($method->getArguments() as $argument) { foreach ($method->getArguments() as $argument) {
$types[] = $argument->getType(); $types[] = $argument->getType();
} }
foreach ($method->getHeaders() as $header) {
$types[] = $header->getType();
}
$types[] = $method->getReturn(); $types[] = $method->getReturn();
} }

View File

@ -27,6 +27,7 @@ use Symfony\Component\Config\Loader\LoaderInterface;
*/ */
class WebServiceContext class WebServiceContext
{ {
private $requestHeaderMessageBinder;
private $requestMessageBinder; private $requestMessageBinder;
private $responseMessageBinder; private $responseMessageBinder;
private $typeRepository; private $typeRepository;
@ -40,12 +41,13 @@ class WebServiceContext
private $serviceBinder; private $serviceBinder;
private $serverFactory; 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->loader = $loader;
$this->wsdlFileDumper = $dumper; $this->wsdlFileDumper = $dumper;
$this->requestMessageBinder = $requestMessageBinder; $this->requestHeaderMessageBinder = $requestHeaderMessageBinder;
$this->responseMessageBinder = $responseMessageBinder; $this->requestMessageBinder = $requestMessageBinder;
$this->responseMessageBinder = $responseMessageBinder;
$this->typeRepository = $typeRepository; $this->typeRepository = $typeRepository;
$this->converterRepository = $converterRepository; $this->converterRepository = $converterRepository;
@ -90,7 +92,7 @@ class WebServiceContext
public function getServiceBinder() public function getServiceBinder()
{ {
if (null === $this->serviceBinder) { 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; return $this->serviceBinder;