added initial support for service binding
This commit is contained in:
@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
namespace Bundle\WebServiceBundle\ServiceBinding;
|
||||
|
||||
use Bundle\WebServiceBundle\ServiceDefinition\Method;
|
||||
|
||||
class DocumentLiteralWrappedRequestMessageBinder implements MessageBinderInterface
|
||||
{
|
||||
public function processMessage(Method $messageDefinition, $message)
|
||||
{
|
||||
if(count($message) > 1)
|
||||
{
|
||||
throw new \InvalidArgumentException();
|
||||
}
|
||||
|
||||
$result = array();
|
||||
$message = $message[0];
|
||||
|
||||
foreach($messageDefinition->getArguments() as $argument)
|
||||
{
|
||||
$result[$argument->getName()] = $message->{$argument->getName()};
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
<?php
|
||||
|
||||
namespace Bundle\WebServiceBundle\ServiceBinding;
|
||||
|
||||
use Bundle\WebServiceBundle\ServiceDefinition\Method;
|
||||
|
||||
class DocumentLiteralWrappedResponseMessageBinder implements MessageBinderInterface
|
||||
{
|
||||
public function processMessage(Method $messageDefinition, $message)
|
||||
{
|
||||
$result = new \stdClass();
|
||||
$result->{$messageDefinition->getName() . 'Result'} = $message;
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
18
ServiceBinding/MessageBinderInterface.php
Normal file
18
ServiceBinding/MessageBinderInterface.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
namespace Bundle\WebServiceBundle\ServiceBinding;
|
||||
|
||||
use Bundle\WebServiceBundle\ServiceDefinition\Method;
|
||||
|
||||
interface MessageBinderInterface
|
||||
{
|
||||
/**
|
||||
*
|
||||
*
|
||||
* @param Method $messageDefinition
|
||||
* @param mixed $message
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
function processMessage(Method $messageDefinition, $message);
|
||||
}
|
22
ServiceBinding/RpcLiteralRequestMessageBinder.php
Normal file
22
ServiceBinding/RpcLiteralRequestMessageBinder.php
Normal file
@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
namespace Bundle\WebServiceBundle\ServiceBinding;
|
||||
|
||||
use Bundle\WebServiceBundle\ServiceDefinition\Method;
|
||||
|
||||
class RpcLiteralRequestMessageBinder implements MessageBinderInterface
|
||||
{
|
||||
public function processMessage(Method $messageDefinition, $message)
|
||||
{
|
||||
$result = array();
|
||||
$i = 0;
|
||||
|
||||
foreach($messageDefinition->getArguments() as $argument)
|
||||
{
|
||||
$result[$argument->getName()] = $message[$i];
|
||||
$i++;
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
13
ServiceBinding/RpcLiteralResponseMessageBinder.php
Normal file
13
ServiceBinding/RpcLiteralResponseMessageBinder.php
Normal file
@ -0,0 +1,13 @@
|
||||
<?php
|
||||
|
||||
namespace Bundle\WebServiceBundle\ServiceBinding;
|
||||
|
||||
use Bundle\WebServiceBundle\ServiceDefinition\Method;
|
||||
|
||||
class RpcLiteralResponseMessageBinder implements MessageBinderInterface
|
||||
{
|
||||
public function processMessage(Method $messageDefinition, $message)
|
||||
{
|
||||
return $message;
|
||||
}
|
||||
}
|
101
ServiceBinding/ServiceBinder.php
Normal file
101
ServiceBinding/ServiceBinder.php
Normal file
@ -0,0 +1,101 @@
|
||||
<?php
|
||||
|
||||
namespace Bundle\WebServiceBundle\ServiceBinding;
|
||||
|
||||
use Bundle\WebServiceBundle\Soap\SoapHeader;
|
||||
|
||||
use Bundle\WebServiceBundle\ServiceDefinition\ServiceDefinition;
|
||||
use Bundle\WebServiceBundle\ServiceDefinition\Header;
|
||||
use Bundle\WebServiceBundle\ServiceDefinition\Dumper\DumperInterface;
|
||||
use Bundle\WebServiceBundle\ServiceDefinition\Loader\LoaderInterface;
|
||||
|
||||
class ServiceBinder
|
||||
{
|
||||
/**
|
||||
* @var \Bundle\WebServiceBundle\ServiceDefinition\ServiceDefinition
|
||||
*/
|
||||
private $definition;
|
||||
|
||||
/**
|
||||
* @var \Bundle\WebServiceBundle\ServiceDefinition\Dumper\DumperInterface
|
||||
*/
|
||||
private $definitionDumper;
|
||||
|
||||
/**
|
||||
* @var \Bundle\WebServiceBundle\ServiceBinding\MessageBinderInterface
|
||||
*/
|
||||
private $requestMessageBinder;
|
||||
|
||||
/**
|
||||
* @var \Bundle\WebServiceBundle\ServiceBinding\MessageBinderInterface
|
||||
*/
|
||||
private $responseMessageBinder;
|
||||
|
||||
public function __construct(
|
||||
ServiceDefinition $definition,
|
||||
LoaderInterface $loader,
|
||||
DumperInterface $dumper,
|
||||
MessageBinderInterface $requestMessageBinder,
|
||||
MessageBinderInterface $responseMessageBinder
|
||||
)
|
||||
{
|
||||
$loader->loadServiceDefinition($definition);
|
||||
|
||||
$this->definition = $definition;
|
||||
$this->definitionDumper = $dumper;
|
||||
|
||||
$this->requestMessageBinder = $requestMessageBinder;
|
||||
$this->responseMessageBinder = $responseMessageBinder;
|
||||
}
|
||||
|
||||
public function getSerializedServiceDefinition()
|
||||
{
|
||||
// TODO: add caching
|
||||
return $this->definitionDumper->dumpServiceDefinition($this->definition);
|
||||
}
|
||||
|
||||
public function isServiceHeader($name)
|
||||
{
|
||||
return $this->definition->getHeaders()->has($name);
|
||||
}
|
||||
|
||||
public function isServiceMethod($name)
|
||||
{
|
||||
return $this->definition->getMethods()->has($name);
|
||||
}
|
||||
|
||||
public function processServiceHeader($name, $data)
|
||||
{
|
||||
$headerDefinition = $this->definition->getHeaders()->get($name);
|
||||
|
||||
return $this->createSoapHeader($headerDefinition, $data);
|
||||
}
|
||||
|
||||
public function processServiceMethodArguments($name, $arguments)
|
||||
{
|
||||
$methodDefinition = $this->definition->getMethods()->get($name);
|
||||
|
||||
$result = array();
|
||||
$result['_controller'] = $methodDefinition->getController();
|
||||
$result = array_merge($result, $this->requestMessageBinder->processMessage($methodDefinition, $arguments));
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
public function processServiceMethodReturnValue($name, $return)
|
||||
{
|
||||
$methodDefinition = $this->definition->getMethods()->get($name);
|
||||
|
||||
return $this->responseMessageBinder->processMessage($methodDefinition, $return);
|
||||
}
|
||||
|
||||
protected function createSoapHeader(Header $headerDefinition, $data)
|
||||
{
|
||||
if(!preg_match('/^\{(.+)\}(.+)$/', $headerDefinition->getType()->getXmlType(), $matches))
|
||||
{
|
||||
throw new \InvalidArgumentException();
|
||||
}
|
||||
|
||||
return new SoapHeader($matches[1], $matches[2], $data);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user