Added besimple.soap.response service

It is highly recommended not to instantiate BeSimple\SoapBundle\Soap\SoapResponse
but to use the service besimple.soap.response

Before:

    public function helloAction($name)
    {
        return new SoapResponse("Hello ".$name);
    }

After:

    public function helloAction($name)
    {
        return $this
            ->container
            ->get('besimple.soap.response')
            ->setReturnValue("Hello ".$name)
        ;
    }
This commit is contained in:
Francis Besset 2011-08-27 22:47:58 +02:00
parent d4662ffe20
commit b4da2f727e
7 changed files with 24 additions and 20 deletions

View File

@ -58,15 +58,15 @@ class SoapWebServiceController extends ContainerAware
$this->serviceBinder = $webServiceContext->getServiceBinder(); $this->serviceBinder = $webServiceContext->getServiceBinder();
$this->soapRequest = SoapRequest::createFromHttpRequest($this->container->get('request')); $this->soapRequest = SoapRequest::createFromHttpRequest($this->container->get('request'));
$this->soapServer = $webServiceContext->getServerFactory()->create($this->soapRequest, new SoapResponse()); $this->soapServer = $webServiceContext->getServerFactory()->create($this->soapRequest, $this->getResponse());
$this->soapServer->setObject($this); $this->soapServer->setObject($this);
ob_start(); ob_start();
$this->soapServer->handle($this->soapRequest->getSoapMessage()); $this->soapServer->handle($this->soapRequest->getSoapMessage());
$this->soapResponse->setContent(ob_get_clean()); $this->getResponse()->setContent(ob_get_clean());
return $this->soapResponse; return $this->getResponse();
} }
/** /**
@ -127,14 +127,14 @@ class SoapWebServiceController extends ContainerAware
$this->soapResponse = $this->checkResponse($response); $this->soapResponse = $this->checkResponse($response);
// add response soap headers to soap server // add response soap headers to soap server
foreach ($this->soapResponse->getSoapHeaders() as $header) { foreach ($this->getResponse()->getSoapHeaders() as $header) {
$this->soapServer->addSoapHeader($header->toNativeSoapHeader()); $this->soapServer->addSoapHeader($header->toNativeSoapHeader());
} }
// return operation return value to soap server // return operation return value to soap server
return $this->serviceBinder->processServiceMethodReturnValue( return $this->serviceBinder->processServiceMethodReturnValue(
$method, $method,
$this->soapResponse->getReturnValue() $this->getResponse()->getReturnValue()
); );
} else { } else {
// collect request soap headers // collect request soap headers
@ -155,7 +155,7 @@ class SoapWebServiceController extends ContainerAware
*/ */
public function getResponse() public function getResponse()
{ {
return $this->soapResponse; return $this->soapResponse ?: $this->soapResponse = $this->container->get('besimple.soap.response');
} }
/** /**
@ -165,12 +165,12 @@ class SoapWebServiceController extends ContainerAware
* *
* @return SoapResponse A valid SoapResponse * @return SoapResponse A valid SoapResponse
* *
* @throws InvalidArgumentException if the given Response is null or not a SoapResponse * @throws InvalidArgumentException if the given Response is not an instance of SoapResponse
*/ */
protected function checkResponse(Response $response) protected function checkResponse(Response $response)
{ {
if (!$response instanceof SoapResponse) { if (!$response instanceof SoapResponse) {
throw new \InvalidArgumentException(); throw new \InvalidArgumentException('You must return an instance of BeSimple\SoapBundle\Soap\SoapResponse');
} }
return $response; return $response;

View File

@ -4,6 +4,7 @@
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"> xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
<parameters> <parameters>
<parameter key="besimple.soap.response.class">BeSimple\SoapBundle\Soap\SoapResponse</parameter>
<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_header.rpcliteral.class">BeSimple\SoapBundle\ServiceBinding\RpcLiteralRequestHeaderMessageBinder</parameter>
@ -17,6 +18,8 @@
</parameters> </parameters>
<services> <services>
<service id="besimple.soap.response" class="%besimple.soap.response.class%" />
<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" />

View File

@ -34,18 +34,20 @@ Annotations for Controllers
.. code-block:: php .. code-block:: php
use BeSimple\SoapBundle\ServiceDefinition\Annotation as Soap; namespace My\App\Controller;
use BeSimple\SoapBundle\Soap\SoapResponse;
class DemoController extends Controller use BeSimple\SoapBundle\ServiceDefinition\Annotation as Soap;
use Symfony\Component\DependencyInjection\ContainerAware;
class DemoController extends ContainerAware
{ {
/** /**
* @Soap\Method("Hello") * @Soap\Method("hello")
* @Soap\Param("name", phpType = "string") * @Soap\Param("name", phpType = "string")
* @Soap\Result(phpType = "string") * @Soap\Result(phpType = "string")
*/ */
public function helloAction($name) public function helloAction($name)
{ {
return new SoapResponse(sprintf('Hello %s!', $name)); return $this->container->get('besimple.soap.response')->setReturnValue(sprintf('Hello %s!', $name));
} }
} }

View File

@ -9,7 +9,6 @@ Controller
namespace My\App\Controller; namespace My\App\Controller;
use BeSimple\SoapBundle\ServiceDefinition\Annotation as Soap; use BeSimple\SoapBundle\ServiceDefinition\Annotation as Soap;
use BeSimple\SoapBundle\Soap\SoapResponse;
use Symfony\Component\DependencyInjection\ContainerAware; use Symfony\Component\DependencyInjection\ContainerAware;
class DemoController extends ContainerAware class DemoController extends ContainerAware
@ -21,6 +20,6 @@ Controller
*/ */
public function helloAction(array $names) public function helloAction(array $names)
{ {
return new SoapResponse("Hello ".implode(', ', $names)); return $this->container->get('besimple.soap.response')->setReturnValue("Hello ".implode(', ', $names));
} }
} }

View File

@ -15,7 +15,6 @@ Controller
namespace My\App\Controller; namespace My\App\Controller;
use BeSimple\SoapBundle\ServiceDefinition\Annotation as Soap; use BeSimple\SoapBundle\ServiceDefinition\Annotation as Soap;
use BeSimple\SoapBundle\Soap\SoapResponse;
use Symfony\Component\DependencyInjection\ContainerAware; use Symfony\Component\DependencyInjection\ContainerAware;
class DemoController extends ContainerAware class DemoController extends ContainerAware
@ -29,13 +28,13 @@ Controller
{ {
$user = $this->container->getDoctrine()->getRepository('MyApp:User')->findOneBy(array( $user = $this->container->getDoctrine()->getRepository('MyApp:User')->findOneBy(array(
'name' => $name, 'name' => $name,
); ));
if (!$user) { if (!$user) {
throw new \SoapFault('USER_NOT_FOUND', sprintf('The user with the name "%s" can not be found', $name)); throw new \SoapFault('USER_NOT_FOUND', sprintf('The user with the name "%s" can not be found', $name));
} }
return new SoapResponse($user); return $this->container->get('besimple.soap.response')->setReturnValue($user);
} }
} }

View File

@ -9,7 +9,6 @@ Controller
namespace My\App\Controller; namespace My\App\Controller;
use BeSimple\SoapBundle\ServiceDefinition\Annotation as Soap; use BeSimple\SoapBundle\ServiceDefinition\Annotation as Soap;
use BeSimple\SoapBundle\Soap\SoapResponse;
use Symfony\Component\DependencyInjection\ContainerAware; use Symfony\Component\DependencyInjection\ContainerAware;
class DemoController extends ContainerAware class DemoController extends ContainerAware
@ -27,6 +26,6 @@ Controller
throw new \SoapFault("INVALID_API_KEY", "The api_key is invalid."); throw new \SoapFault("INVALID_API_KEY", "The api_key is invalid.");
} }
return new SoapResponse("Hello ".implode(', ', $names)); return $this->container->get('besimple.soap.response')->setReturnValue("Hello ".implode(', ', $names));
} }
} }

View File

@ -58,6 +58,8 @@ class SoapResponse extends Response
public function setReturnValue($value) public function setReturnValue($value)
{ {
$this->soapReturnValue = $value; $this->soapReturnValue = $value;
return $this;
} }
public function getReturnValue() public function getReturnValue()