我有問題將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>detail
爲MyPlanWSError
類。
任何想法?:)
這奏效了!謝謝一堆! :) – user1028037