2012-11-23 31 views
4

我有問題將PHP異常轉換爲泛型類。轉換PHP異常(肥皂故障)到一個特定的類

我打電話給一個web服務方法,當它失敗時,它返回一個帶有「detail tag」信息的soap錯誤。這是結果的樣子,如果我調用Web服務方法用肥皂UI(http://soapui.org):

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Body> 
     <s:Fault> 
     <faultcode>s:Client</faultcode> 
     <faultstring xml:lang="sv-SE">Error Posting New Sponsor Full to Middleware</faultstring> 
     <detail> 
      <MyPlanWSError xmlns="http://schemas.datacontract.org/2004/07/MyPlanPOA" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
       <BadParameters i:nil="true"/> 
       <Details>2 duplicate(s) detected</Details> 
       <Duplicates> 
        <DuplicateInfo> 
        <DuplicatedExtRelNo>0</DuplicatedExtRelNo> 
        <POAStatus>New</POAStatus> 
        <Source>NewExtRels</Source> 
        <SourceRecordID>194</SourceRecordID> 
        <Type>eMail</Type> 
        </DuplicateInfo> 
        <DuplicateInfo> 
        <DuplicatedExtRelNo>0</DuplicatedExtRelNo> 
        <POAStatus>New</POAStatus> 
        <Source>NewExtRels</Source> 
        <SourceRecordID>194</SourceRecordID> 
        <Type>Address</Type> 
        </DuplicateInfo> 
       </Duplicates> 
       <ErrorNumber>7</ErrorNumber> 
      </MyPlanWSError> 
     </detail> 
     </s:Fault> 
    </s:Body> 
</s:Envelope> 

我想要得到的MyPlanWSError內容,在「詳細信息」標籤。我想將其轉換爲一個PHP類。

我已經使用了很好的工具wsdl2php(http://www.urdalen.no/wsdl2php)來生成基於wsdl文件的幫助類,這樣我就不必親自編寫所有代碼:)工具產生它看起來像這樣的MyPlanWSError:

class MyPlanWSError 
{ 
    public $BadParameters; 
    public $Details; 
    public $Duplicates; 
    public $ErrorNumber; 
    public function __construct($BadParameters, $Details, $Duplicates, $ErrorNumber) 
    { 
    $this->BadParameters = $BadParameters; 
    $this->Details = $Details; 
    $this->Duplicates = $Duplicates; 
    $this->ErrorNumber = $ErrorNumber; 
    } 
} 

當我調用Web服務方法(即返回SOAP錯誤),我這樣做,在一個try catch子句:

function add_new_sponsor() { 
    // ... code 
    try { 
    $new_sponsor = new PostNewSponsor(
     $accessKey, 
     $type, 
     $initialRecordStatus, 
     $monthlyAmount, 
     $categoryCode, 
     $titleCode, 
     $firstName, 
     $lastName, 
     $organisationName, 
     $street, 
     $houseNumber, 
     $apartment, 
     $extraAddressLine, 
     $postCode, 
     $town, 
     $countryISOCode, 
     $privatePhone, 
     $mobilePhone, 
     $workPhone, 
     $eMailAddress, 
     $sourceCode, 
     $paymentFrequencyCode, 
     $paymentTypeCode, 
     $numberOfChildren, 
     $scGender, 
     $continentCode, 
     $scCountryISOCode, 
     $olderChildFlag, 
     $personalID, 
     $AddressTypeCode, 
     $extRelNo, 
     $comments, 
     $iPAddress); 

    $result = plan_utils_post_sponsor($new_sponsor); 
    } catch (Exception $e) { 
    echo 'Exception->detail var_dump: <br/>'; 
    var_dump($e->detail); 
    echo '<br/></br>'; 

    $myplan_error = cast('MyPlanWSError', $e->detail); 
    echo 'MyPlanWSError var_dump <br/>'; 
    var_dump($myplan_error); 
    echo '<br/><br/>'; 

    echo 'MyPlanWSError->Details var_dump <br/>'; 
    var_dump($myplan_error->Details); 
    echo '<br/><br/>'; 
    } 
} 

function cast($destination, $sourceObject) 
{ 
    if (is_string($destination)) { 
     $destination = new $destination(); 
    } 
    $sourceReflection = new ReflectionObject($sourceObject); 
    $destinationReflection = new ReflectionObject($destination); 
    $sourceProperties = $sourceReflection->getProperties(); 
    foreach ($sourceProperties as $sourceProperty) { 
     $sourceProperty->setAccessible(true); 
     $name = $sourceProperty->getName(); 
     $value = $sourceProperty->getValue($sourceObject); 
     if ($destinationReflection->hasProperty($name)) { 
      $propDest = $destinationReflection->getProperty($name); 
      $propDest->setAccessible(true); 
      $propDest->setValue($destination,$value); 
     } else { 
      $destination->$name = $value; 
     } 
    } 
    return $destination; 
} 

鑄造法是取自//stackoverflow.com/questions/3243900/convert-cast-an-stdclass-object-to-another-cl屁股。

所以我希望輸出是從var_dump($myplan_error->Details)"2 duplicate(s) detected"而是我得到NULL :(

下面是從catch子句輸出全:

Exception->detail var_dump: 
object(stdClass)#4 (1) { ["MyPlanWSError"]=> object(stdClass)#5 (4) { ["BadParameters"]=> NULL ["Details"]=> string(23) "2 duplicate(s) detected" ["Duplicates"]=> object(stdClass)#6 (1) { ["DuplicateInfo"]=> array(2) { [0]=> object(stdClass)#7 (5) { ["DuplicatedExtRelNo"]=> string(1) "0" ["POAStatus"]=> string(3) "New" ["Source"]=> string(10) "NewExtRels" ["SourceRecordID"]=> string(3) "194" ["Type"]=> string(5) "eMail" } [1]=> object(stdClass)#8 (5) { ["DuplicatedExtRelNo"]=> string(1) "0" ["POAStatus"]=> string(3) "New" ["Source"]=> string(10) "NewExtRels" ["SourceRecordID"]=> string(3) "194" ["Type"]=> string(7) "Address" } } } ["ErrorNumber"]=> string(1) "7" } } 

MyPlanWSError var_dump 
object(MyPlanWSError)#3 (5) { ["BadParameters"]=> NULL ["Details"]=> NULL ["Duplicates"]=> NULL ["ErrorNumber"]=> NULL ["MyPlanWSError"]=> object(stdClass)#5 (4) { ["BadParameters"]=> NULL ["Details"]=> string(23) "2 duplicate(s) detected" ["Duplicates"]=> object(stdClass)#6 (1) { ["DuplicateInfo"]=> array(2) { [0]=> object(stdClass)#7 (5) { ["DuplicatedExtRelNo"]=> string(1) "0" ["POAStatus"]=> string(3) "New" ["Source"]=> string(10) "NewExtRels" ["SourceRecordID"]=> string(3) "194" ["Type"]=> string(5) "eMail" } [1]=> object(stdClass)#8 (5) { ["DuplicatedExtRelNo"]=> string(1) "0" ["POAStatus"]=> string(3) "New" ["Source"]=> string(10) "NewExtRels" ["SourceRecordID"]=> string(3) "194" ["Type"]=> string(7) "Address" } } } ["ErrorNumber"]=> string(1) "7" } } 

MyPlanWSError->Details var_dump 
NULL 

所以看來問題是,我能不能成功轉換$e>detailMyPlanWSError類。

任何想法?:)

回答

1

看起來您正在嘗試投射詳細對象,而不是MyPlanWSError對象。因此,它的屬性不匹配,並且結果對象具有全部空值。

試試這個,它應該很好地工作:

$myplan_error = cast('MyPlanWSError', $e->detail->MyPlanWSError); 
+0

這奏效了!謝謝一堆! :) – user1028037