ID:               39179
 Comment by:       styx31 at gmail dot com
 Reported By:      jchernia at netsuite dot com
 Status:           No Feedback
 Bug Type:         SOAP related
 Operating System: Windows XP
 PHP Version:      5.1.6
 Assigned To:      dmitry
 New Comment:

This bug is still present in the last version.

SoapClient does not honor polymorphism correctly, with or without
abstract types

Sample WSDL :

<complexType name="PersonIdentity">
  <sequence>
    <element name="Id" type="xsd:string" />
  </sequence>
</complexType>
<complexType name="Person">
  <complexContent extends="PersonIdentity">
    <sequence>
      <element name="Name" type="xsd:string" />
      <element name="FirstName" type="xsd:string" />
    </sequence>
  </complexContent>
</complexType>

Operation contract :

<complexType name="CheckPerson">
 <sequence>
  <element name="Person" type="PersonIdentity"/>
 </sequence>
</complexType>

The operation CheckPerson accepts both Person and PersonIdentity.

Despite the fact that you can create a class which correponds in PHP :

class PersonIdentity {
  public $Id;
}

class Person extends PersonIdentity {
  public $Name;
  public $FirstName;
}

If you use a Person instance when you call CheckPerson() :
- the Person will be serialized as a PersonIdentity,
- no i:type="Person" attribute will be added to the <Person> element,
- the properties belonging to the Person class will be dropped


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

[2009-06-16 06:07:08] dasteph+forum at gmail dot com

Hi,

I have pretty the same problem.
Reproducing code: http://castex.de/stuff/php-bug.txt

expected result (in error log)
------------------------------
[15-Jun-2009 16:47:29] client
[15-Jun-2009 16:47:29] server
[15-Jun-2009 16:47:29] TestAbstractRequest Object
(
    [element] => Child Object
        (
            [name] => test
        )

)

actual result
-------------
[15-Jun-2009 16:47:29] client
[15-Jun-2009 16:47:29] server
[15-Jun-2009 16:47:29] TestAbstractRequest Object
(
    [element] => Father Object
        (
            [name] => test
            [number] => 5
        )

)


Regards

Stephan

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

[2009-02-20 04:40:46] jchernia at netsuite dot com

Full WSDL - 

https://webservices.netsuite.com/wsdl/v2008_2_0/netsuite.wsdl

The code that Stu submitted will cause the problem. When making the 
get() request you will get

<baseRef/> 
instead of 
<baseRef internalId="17" type="customer" xsi:type="ns1:RecordRef"/>

where internalId and type are properties of the subclass (RecordRef) 
and not of BaseRef.

-John

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

[2008-09-30 07:47:51] stuart at stuartherbert dot com

Looks like jchernia is trying to access Netsuite's web service
(Netsuite is a popular hosted ERP solution).  You can't access their
SOAP service w/out a valid account, but if you had such an account, the
following code triggers the error:

<?php

class GetRequest
{
        public $baseRef = null;
}

class LoginRequest
{
        public $passport = null;
}

class Passport
{
        public $email = null;
        public $password = null;
        public $account = null;
        public $role = null;
}

class BaseRef
{
        public $name = null;
}

class RecordRef extends BaseRef
{
        public $internalId = null;
        public $externalId = null;
        public $type       = null;
}

$user = new Passport();
$user->email='<your netsuite login>';
$user->password='<your netsuite password>';
$user->account='<your netsuite account ID>';
$user->role=new RecordRef;
$user->role->internalId=<your role ID>;

$loginRequest = new LoginRequest;
$loginRequest->passport = $user;

$soapClient = new
SoapClient('https://webservices.netsuite.com/wsdl/v2008_1_0/netsuite.wsdl',
array('trace' => 1));
$result = $soapClient->login($loginRequest);

$requestRef = new RecordRef;
$requestRef->externalId = 200;
$requestRef->type = 'issue';

try
{
        $issue = $soapClient->get(array('recordRef' => $requestRef));
        var_dump($issue);
}
catch (Exception $e)
{
        var_dump($e);
        var_dump($soapClient->__getLastRequest());
        var_dump($soapClient->__getLastResponse());
}

?>

__getLastRequest() reports:

<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/";
xmlns:ns1="urn:messages_2008_2.platform.webservices.netsuite.com"><SOAP-ENV:Body><ns1:get><ns1:baseRef/></ns1:get></SOAP-ENV:Body></SOAP-ENV:Envelope>

and __getLastResponse() reports:

<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/";
xmlns:xsd="http://www.w3.org/2001/XMLSchema";
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>
  <soapenv:Body>
    <soapenv:Fault>
      <faultcode>soapenv:Server.userException</faultcode>
      <faultstring>org.xml.sax.SAXException:
{urn:core_2008_2.platform.webservices.netsuite.com}BaseRef is an
abstract type and cannot be instantiated</faultstring>
      <detail>
        <ns1:hostname
xmlns:ns1="http://xml.apache.org/axis/";>partners-java001.svale.netledger.com</ns1:hostname>
      </detail>
    </soapenv:Fault>
  </soapenv:Body>
</soapenv:Envelope>

Note the empty <ns1:baseRef/> in the request.  baseRef is an abstract
type, in this case extended the recordRef.  The correct SOAP request is
listed by the original poster.

Hope that helps.  If you need a Netsuite account for testing purposes,
contact me privately and I'll sort one out for you.

Best regards,
Stu
--

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

[2006-10-31 01:00:01] php-bugs at lists dot php dot net

No feedback was provided for this bug for over a week, so it is
being suspended automatically. If you are able to provide the
information that was originally requested, please do so and change
the status of the bug back to "Open".

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

[2006-10-23 05:38:17] dmi...@php.net

Could you provide full WSDL file and SOAP request or reeponce that
ext/soap cannot handle correct.

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

The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
    http://bugs.php.net/39179

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

Reply via email to