我遇到问题将一个PHP异常转换为泛型类。
我正在调用一个Web服务方法,当它失败时,它将返回带有“detail标记”中的信息的soap错误。 如果我使用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; }这个强制转换方法取自http://stackoverflow.com/questions/3243900/convert-cast-an-stdclass-object-to-another-class。
所以我期望从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类。
有任何想法吗? :)
I am having problem converting a php Exception to a generic class.
I am calling a web service method and when it fails it returns a soap fault with information in the "detail tag". This is how the result looks like if I call the web service method with Soap 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>I want to get the MyPlanWSError content that is in the "detail" tag. I want to convert that to a php class.
I have used the nice tool wsdl2php (http://www.urdalen.no/wsdl2php) to generate helper classes based on a wsdl file, so that I don't have to write all code myself :) The tool generated the MyPlanWSError which looks like this:
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; } }When I call the web service method (that returns the soap fault), I do that in a try catch clause:
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; }The cast method was taken from //http://stackoverflow.com/questions/3243900/convert-cast-an-stdclass-object-to-another-class.
So what I expect the output to be from the var_dump($myplan_error->Details) is "2 duplicate(s) detected" but instead I get NULL :(
Here is the whole output from the catch clause:
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 NULLSo it seems the problem is that I can't succeed converting the $e>detail to a MyPlanWSError class.
Any ideas? :)
最满意答案
看起来你想要转换细节对象,而不是MyPlanWSError对象。 因此,它的属性不匹配,并且结果对象具有全部空值。
试试这个,它应该工作得很好:
$myplan_error = cast('MyPlanWSError', $e->detail->MyPlanWSError);Looks like you're trying to cast the detail object, not the MyPlanWSError object. Thus, its properties aren't matching up, and the resulting object has all null values.
Try this instead, and it should work fine:
$myplan_error = cast('MyPlanWSError', $e->detail->MyPlanWSError);更多推荐
MyPlanWSError,var_dump,电脑培训,计算机培训,IT培训"/> <meta name="descri
发布评论