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 class RpcLiteralResponseMessageBinder implements MessageBinderInterface
{ {
private $messageRefs = array();
public function processMessage(Method $messageDefinition, $message, array $definitionComplexTypes = array()) public function processMessage(Method $messageDefinition, $message, array $definitionComplexTypes = array())
{ {
$return = $messageDefinition->getReturn(); $return = $messageDefinition->getReturn();
@ -61,7 +63,13 @@ class RpcLiteralResponseMessageBinder implements MessageBinderInterface
throw new \InvalidArgumentException(); throw new \InvalidArgumentException();
} }
$hash = spl_object_hash($message);
if (isset($this->messageRefs[$hash])) {
return $this->messageRefs[$hash];
}
$stdClass = new \stdClass(); $stdClass = new \stdClass();
$this->messageRefs[$hash] = $stdClass;
foreach ($definitionComplexTypes[$type] as $type) { foreach ($definitionComplexTypes[$type] as $type) {
if ($type instanceof PropertyComplexType) { if ($type instanceof PropertyComplexType) {

View File

@ -83,6 +83,24 @@ class RpcLiteralResponseMessageBinderTest extends \PHPUnit_Framework_TestCase
$this->assertSame(123992, $result[1]->bar); $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() public function messageProvider()
{ {
$messages = array(); $messages = array();