ID:               34218
 Updated by:       [EMAIL PROTECTED]
 Reported By:      Wojciech dot Szela at gmail dot com
-Status:           Open
+Status:           Feedback
 Bug Type:         SOAP related
 Operating System: SuSe Linux 9.3
 PHP Version:      5.0.4
 New Comment:

Please try using this CVS snapshot:

  http://snaps.php.net/php5-latest.tar.gz
 
For Windows:
 
  http://snaps.php.net/win32/php5-win32-latest.zip




Previous Comments:
------------------------------------------------------------------------

[2005-08-23 10:16:12] Wojciech dot Szela at gmail dot com

Description:
------------
There's a problem with objects' class name received by soap server,
when passed in request object is inheriting from other one. For
example:
data type definition in wsdl:
<xsd:complexType name="Vehicle">
 <xsd:all>
  <xsd:element name="loadWeight" type="xsd:int"></xsd:element>
 </xsd:all>
</xsd:complexType>

<xsd:complexType name="Car">
 <xsd:complexContent>
  <xsd:extension base="tns:Vehicle">
   <xsd:all>
    <xsd:element name="engineNumber" type="xsd:string"></xsd:element>
   </xsd:all>
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>

Second object is inheriting from the first one. And we have operation
defined like that:
<wsdl:message name="addCarResponse">
 <wsdl:part name="return" type="tns:Car"></wsdl:part>
</wsdl:message>
<wsdl:message name="addCarRequest">
 <wsdl:part name="car" type="tns:Car"></wsdl:part>
</wsdl:message>

<wsdl:operation name="addCar">
 <soap:operation
soapAction="http://www.foo.com/VehicleService/addCar"/>
  <wsdl:input>
   <soap:body use="encoded"
namespace="http://www.foo.com/VehicleService/";
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
  </wsdl:input>
  <wsdl:output><soap:body use="encoded"
namespace="http://www.foo.com/VehicleService/";
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
  </wsdl:output>
</wsdl:operation>

Soap client is written in Java (axis). Method addCar is invoked with
variable of type Car. Soap server (PHP5) receives proper structure of
object - it has all fields, inherited from father and it's own, but
get_class(passedObject) returns father's class name (Vehicle). Class
mapping is correct. WSDL file is correct. Even returned object, also of
type Car, is correct. 

Reproduce code:
---------------
$classmap = array( 'Car' => 'Car', 'Vehicle' => 'Vehicle' );
class fooService {
 public addCar($car) {
  $fh = fopen("foo.txt","a+"); fwrite($fh,get_class($car)+"\n");
fwrite($fh,var_export($car,true)); fclose($fh);
  $storedObject = $this->storeInDB($car);
  return $storedObject;
 }
ini_set('soap.wsdl_cache_enabled',"0");
$server = new SoapServer('fooService.wsdl',array('classmap' =>
$classmap');
$server->setClass(fooService);
$server->handle();

Expected result:
----------------
File content:
Car
Car: loadWeight->someValue
Car: engineNumber->someOtherValue

Actual result:
--------------
File content:
Vehicle
Vehicle: loadWeight->someValue
Vehicle: engineNumber->someOtherValue


------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=34218&edit=1

Reply via email to