Used the object hash in RpcLiteralResponseMessageBinder to return a same instance of an object

This commit is contained in:
Francis Besset 2011-07-27 23:15:47 +02:00
parent 8cd07acc11
commit a0a3216469
2 changed files with 26 additions and 0 deletions

View File

@ -20,6 +20,8 @@ use BeSimple\SoapBundle\ServiceDefinition\Strategy\MethodComplexType;
*/
class RpcLiteralResponseMessageBinder implements MessageBinderInterface
{
private $messageRefs = array();
public function processMessage(Method $messageDefinition, $message, array $definitionComplexTypes = array())
{
$return = $messageDefinition->getReturn();
@ -61,7 +63,13 @@ class RpcLiteralResponseMessageBinder implements MessageBinderInterface
throw new \InvalidArgumentException();
}
$hash = spl_object_hash($message);
if (isset($this->messageRefs[$hash])) {
return $this->messageRefs[$hash];
}
$stdClass = new \stdClass();
$this->messageRefs[$hash] = $stdClass;
foreach ($definitionComplexTypes[$type] as $type) {
if ($type instanceof PropertyComplexType) {

View File

@ -83,6 +83,24 @@ class RpcLiteralResponseMessageBinderTest extends \PHPUnit_Framework_TestCase
$this->assertSame(123992, $result[1]->bar);
}
public function testProcessMessageWithComplexTypeReferences()
{
$attributes = new Attributes();
$attributes->foo = 'bar';
$attributes->bar = 2929;
$message = array($attributes, $attributes);
$messageBinder = new RpcLiteralResponseMessageBinder();
$result = $messageBinder->processMessage(
new Method('complextype_argument', null, array(), new Type('\BeSimple\SoapBundle\Tests\ServiceBinding\fixtures\Attributes[]')),
$message,
$this->getDefinitionComplexTypes()
);
$this->assertInstanceOf('stdClass', $result[0]);
$this->assertSame($result[0], $result[1]);
}
public function messageProvider()
{
$messages = array();