Re: A few questions about PHP's SOAP module

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Aug 7, 2008 at 1:29 PM, Christoph Boget <jcboget@xxxxxxxxx> wrote:

> * I'm trying to better understand the 'classmap' option for the
> SoapClient class.  Is it used to define the class of an instantiated
> object which will be passed as an argument to the server's function
> call?  So, as a very simplistic example, it might go something like
> this:
>
> <?php
>  class MyClass
>  {
>    public $sStockSymbol ;
>    public function __construct( $sStockSymbol )
>    {
>      $this->sStockSymbol = $sStockSymbol;
>    }
>  }
>
>  $oObj = new MyClass( 'ibm' );
>  $oClient = new SoapClient( $sWSDL_URI, array( 'classmap' => array(
> 'StockSymbol' => 'MyClass' )));
>
>  $oClient->getStockValue( $oObj );
> ?>
>
> Am I even close?


first off, let me recommend the phpt tests in the php source.  for the soap
stuff, you will find them under ext/soap/tests.  i was looking through a few
of them.  looks like if you have a chunk of wsdl, like this

            <xsd:complexType
name="book">


<xsd:all>

                    <xsd:element name="a"
type="xsd:string"/>
                    <xsd:element name="b"
type="xsd:string"/>

</xsd:all>

            </xsd:complexType>

you can map classes to it like this (which i gather you already got) w/ the
$options param in the SoapClient constructor

class book{
    public $a="a";
    public $b="c";
}

it looks like you can use contructors too though, im a bit too lazy to hash
out the details as i go through the phpt tests =/  but anyway, instead of
instantiating book ourselves, the SoapClient instance will do that for us,
as in

$sc = new SoapClient(
  $someWsdlAddr,
  array(
    'classmap' => array(
      'book' => 'book'
     )
  )
);

$book = $sc->readBook($myFavBook);

so assuming there was a method defined in the wsdl, roughly like,

<ns1:readBook>
  <res xsi:type="ns1:book">
    <a xsi:type="xsd:string">Lord of the Rings</a>
    <b xsi:type="xsd:string">JRR Token</b>
  </res>
</ns1:readBook>

we could then take the book instance the SoapClient created for us, and do

echo "title: {$book->a}, author: {$book->b}"; /// produces "title: Lord of
the Rings, author: JRR Token"

Now, what happens if one of the required arguments
> to the server function is a variable that has a hyphen in it?  Is
> there any way I can get around that since PHP doesn't allow you to
> define variables with hyphens?


soo, im guessing the wsdl might be something like

            <xsd:complexType
name="book">


<xsd:all>

                    <xsd:element name="a--"
type="xsd:string"/>
                    <xsd:element name="b"
type="xsd:string"/>

</xsd:all>

            </xsd:complexType>

normally, with variable variables, you could hack around this, as in

$varWHyphen = 'a--';
$$varWHyphen = 5;

however, instance variables cannot be created out of variable variables, so
i doubt thats possible in this context.

* Whether using class/objects to pass parameters to a server function
> (assuming I have the above correct) or arrays, how can you define
> further attributes for each parameter?  Is that even possible?


well, i think so.  basically, i think this feature is just a way to have the
SoapClient instantiate an object rather than just returning an array.  so
the examples in the phpt tests are simple, but you might have a class that
actually has methods and so forth, you just use a soap call to create it.
then you go on your way.  this could be a bit more desireable for some folks
than getting an array and using it to create an object themselves, i
suppose.

so for example in the book class above you might have,

public function __toString() {
  return "title: {$this->a}, author: {$this->b}";
}


> So
> here is an example of a SOAP message that the server is expecting:
>
> <?xml version="1.0"?>
> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/";
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
> xmlns:xsd="http://www.w3.org/2001/XMLSchema";>
>  <soap:Body>
>    <ServerFuncName xmlns="urn:/joe/bob/briggs/types">
>      <String1>Var1 Value</String1>
>      <String2>live</String2>
>      <Array1>
>        <SubArray1 status="complete">
>          <SubArray2 xmlns="" encoding="" node-type="">
>            <SubArray3>
>              <node name="attribute1">Node Value</node>
>              <node name="attribute2">Node Value</node>
>              <node name="attribute3">Node Value</node>
>              <node name="attribute4">Node Value</node>
>              <node name="attribute5">Node Value</node>
>            </SubArray3>
>          </SubArray2>
>          <SubArray2 xmlns="" encoding="" node-type=""></SubArray2>
>        </SubArray1>
>      </Array1>
>    </ServerFuncName>
>  </soap:Body>
> </soap:Envelope>
>
> How can I set up the attributes illustrated above?  Encoding,
> node-type, etc?  Is that possible?


dunno, maybe scope the phpt tests and see if you can figure something out..
i might play around w/ the example later, but as i said im weak on the
actual xml structure of the soap spec.

* Finally, is there a really good and/or comprehensive tutorial and/or
> write-up on PHPs SOAP module?  The documentation is pretty spartan and
> what I have found doesn't really go in to much depth.


yea, well, i think we are all in the same boat here.  like i said the phpt
tests are your friend here :D

-nathan

[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux