CakePHP SoapClient丢弃字段?

My app uses CakePHP (2.2.5) to get data from a SOAP server. I put logging into the SoapSource.php connector to see the XML returned and to display the array returned:

$result = $this->client->__soapCall($method, array('parameters' => $tParams));
Logger::write('SOAP Last Response', $this->client->__getLastResponse(), 3, 'transaction');
Logger::write('SOAP Last Response Object', print_r($result, TRUE), 3, 'transaction');

But what I'm seeing in the log is that two (recently-added) fields present in the XML are missing from the array, specifically, the last two before the RPList (formatted here but otherwise verbatim):

<transactionResult>
  <id>test</id>
  <resultCode>0</resultCode>
  <ReadScheduledRecordingsRsp>
    <RecordingDefinitionList>
      <RecordingDefinition>
        <RDId>d8c16d8f-67c6-469a-83c3-d51d8f8859a9</RDId>
        <Title>The Young and the Restless</Title>
        <SeriesId>4422</SeriesId>
        <KeepUntil>SpaceIsNeeded</KeepUntil>
        <StartPadSeconds>0</StartPadSeconds>
        <EndPadSeconds>0</EndPadSeconds>
        <Frequency>EveryDay</Frequency>
        <KeepAtMost>0</KeepAtMost>
        <Priority>23</Priority>
        <ShowType>Any</ShowType>
        <AirtimeDomain>SpecificTime</AirtimeDomain>
        <ChannelDomain>SpecificChannel</ChannelDomain>
        <RPList>
          ...

Followed by:

ARRAY
 (
  [transactionResult] => stdClass Object
   (
    [id] => test
    [resultCode] => 0
    [ReadScheduledRecordingsRsp] => stdClass Object
     (
      [RecordingDefinitionList] => stdClass Object
       (
        [RecordingDefinition] => Array
         (
           [0] => stdClass Object
            (
             [RDId] => d8c16d8f-67c6-469a-83c3-d51d8f8859a9
             [Title] => The Young and the Restless
             [SeriesId] => 4422
             [KeepUntil] => SpaceIsNeeded
             [StartPadSeconds] => 0
             [EndPadSeconds] => 0
             [Frequency] => EveryDay
             [KeepAtMost] => 0
             [Priority] => 23
             [ShowType] => Any
             [RPList] => stdClass Object
              (
              ...

I'm guessing I just forgot or didn't know to do something, but I don't know what. It's just very suspicious that the two fields that don't work are the two that were just added, but I can't find any place where the fields are enumerated.

The WSDL doesn't specify any fields at all, just that there will be a bunch of data inside a transactionResult.

In the connect call, the options likewise don't specify any fields.

It all worked fine until the back-end added those two fields, and it all still works fine, except that I can't see the 2 new fields in the object.

Any ideas?

It would be nice to see the XML for RPList. What version of PHP/libxml?

Have you actually validated the XML returned by __getLastResponse()?

It sounds to me like your using WSDL mode for the client but your WSDL file lacks precision. Try using a WSDL which actually describes the data being served up by the API.

Am I understanding that the $result object when dumped lists RPList but the value is not what you expect? If so you might be able to get away with adding the SOAP_SINGLE_ELEMENT_ARRAYS option to the clients constructor: new SoapClient($wsdl, array('features' => SOAP_SINGLE_ELEMENT_ARRAYS));. That's a long shot though. Need to see WSDL and full output from __getLastResponse().

Any errors? Try wrapping the call like so:

try {

  $client = new SoapClient ('http://yoursite.com?WSDL', 
    array("trace" => 1,
      "exceptions" => true,
      "cache_wsdl" => WSDL_CACHE_NONE,
      "features" => SOAP_SINGLE_ELEMENT_ARRAYS)
  );

  $result = $client->SomeMethod($data);

} catch (SoapFault $exception) {
  var_dump($exception);
} catch (Exception $exception) {
  var_dump($exception);
}

Short of fixing the WSDL/XML response your workaround seems like the best solution.