将php异常(soap fault)转换为特定的类
我在将
PHP异常转换为泛型类时遇到问题.
我正在调用一个Web服务方法,当它失败时,它返回一个soap fault,其中包含“详细信息标记”中的信息.如果我使用Soap UI(http://soapui.org)调用Web服务方法,结果就是这样: <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> 我想获取“detail”标签中的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; } 演员方法取自//https://stackoverflow.com/questions/3243900/convert-cast-an-stdclass-object-to-another-class. 所以我期望输出来自var_dump($myplan_error-> Details)是“检测到2个重复”但是我得到NULL (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |