加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

将php异常(soap fault)转换为特定的类

发布时间:2020-12-13 22:46:14 所属栏目:PHP教程 来源:网络整理
导读:我在将 PHP异常转换为泛型类时遇到问题. 我正在调用一个Web服务方法,当它失败时,它返回一个soap fault,其中包含“详细信息标记”中的信息.如果我使用Soap UI(http://soapui.org)调用Web服务方法,结果就是这样: s:Envelope xmlns:s="http://schemas.xmlsoap.
我在将 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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读