Used MessageBinder of BeSimpleSoapCommon component

This commit is contained in:
Francis Besset 2013-02-21 08:22:55 +01:00
parent a86c680263
commit 794d6cf8c2
3 changed files with 66 additions and 30 deletions

View File

@ -43,6 +43,8 @@ User class
You can expose only the properties (public, protected or private) of a complex type.
**For performance reasons, we advise to create getter and setter for each property.**
.. code-block:: php
namespace Acme\DemoBundle\Entity;
@ -75,6 +77,56 @@ You can expose only the properties (public, protected or private) of a complex t
* @Soap\ComplexType("string")
*/
private $email;
/**
* @Soap\ComplexType("boolean")
*/
private $newsletter;
public function getId()
{
return $this->id;
}
public function getUsername()
{
return $this->username;
}
public function getEmail()
{
return $this->email;
}
public function getFirstname()
{
return $this->firstname;
}
public function setFirstname($firstname)
{
$this->firstname = $firstname;
}
public function getLastname()
{
return $this->lastname;
}
public function setLastname($lastname)
{
$this->lastname = $lastname;
}
public function hasNewsletter()
{
return $this->newsletter;
}
public function setNewsletter($newsletter)
{
$this->newletter = (Boolean) $newsletter
}
}
ComplexType

View File

@ -1,8 +1,10 @@
<?php
/*
* This file is part of the BeSimpleSoapBundle.
*
* (c) Christian Kerl <christian-kerl@web.de>
* (c) Francis Besset <francis.besset@gmail.com>
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
@ -13,8 +15,7 @@ namespace BeSimple\SoapBundle\ServiceBinding;
use BeSimple\SoapBundle\ServiceDefinition\Method;
use BeSimple\SoapBundle\ServiceDefinition\Strategy\MethodComplexType;
use BeSimple\SoapBundle\ServiceDefinition\Strategy\PropertyComplexType;
use Zend\Soap\Wsdl;
use BeSimple\SoapCommon\Util\MessageBinder;
/**
* @author Christian Kerl <christian-kerl@web.de>
@ -86,24 +87,15 @@ class RpcLiteralRequestMessageBinder implements MessageBinderInterface
$this->messageRefs[$hash] = $message;
$r = new \ReflectionClass($message);
$messageBinder = new MessageBinder($message);
foreach ($this->definitionComplexTypes[$phpType] as $type) {
$p = $r->getProperty($type->getName());
if ($p->isPublic()) {
$value = $message->{$type->getName()};
} else {
$p->setAccessible(true);
$value = $p->getValue($message);
}
$property = $type->getName();
$value = $messageBinder->readProperty($property);
if (null !== $value) {
$value = $this->processType($type->getValue(), $value);
if ($p->isPublic()) {
$message->{$type->getName()} = $value;
} else {
$p->setValue($message, $value);
}
$messageBinder->writeProperty($property, $value);
}
if (!$type->isNillable() && null === $value) {

View File

@ -1,8 +1,10 @@
<?php
/*
* This file is part of the BeSimpleSoapBundle.
*
* (c) Christian Kerl <christian-kerl@web.de>
* (c) Francis Besset <francis.besset@gmail.com>
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
@ -13,8 +15,7 @@ namespace BeSimple\SoapBundle\ServiceBinding;
use BeSimple\SoapBundle\ServiceDefinition\Method;
use BeSimple\SoapBundle\ServiceDefinition\Strategy\PropertyComplexType;
use BeSimple\SoapBundle\ServiceDefinition\Strategy\MethodComplexType;
use Zend\Soap\Wsdl;
use BeSimple\SoapCommon\Util\MessageBinder;
/**
* @author Christian Kerl <christian-kerl@web.de>
@ -71,24 +72,15 @@ class RpcLiteralResponseMessageBinder implements MessageBinderInterface
throw new \InvalidArgumentException(sprintf('The instance class must be "%s", "%s" given.', get_class($message), $phpType));
}
$r = new \ReflectionClass($message);
$messageBinder = new MessageBinder($message);
foreach ($this->definitionComplexTypes[$phpType] as $type) {
$p = $r->getProperty($type->getName());
if ($p->isPublic()) {
$value = $message->{$type->getName()};
} else {
$p->setAccessible(true);
$value = $p->getValue($message);
}
$property = $type->getName();
$value = $messageBinder->readProperty($property);
if (null !== $value) {
$value = $this->processType($type->getValue(), $value);
if ($p->isPublic()) {
$message->{$type->getName()} = $value;
} else {
$p->setValue($message, $value);
}
$messageBinder->writeProperty($property, $value);
}
if (!$type->isNillable() && null === $value) {