gpt4 book ai didi

PHP SoapVar 对象属性?

转载 作者:行者123 更新时间:2023-12-03 20:21:58 24 4
gpt4 key购买 nike

有没有人知道如何向 SoapVar 对象添加属性?看起来这很简单,但我无法接受/工作。
我查看了 PHP 文档和以下 stackoverflow 问题:
Documentation on SoapVar ,
堆栈溢出问题:
SoapVar/Param and nested, repeated elements in SOAP
我正在尝试添加像这个数组示例这样的属性,但使用复杂的 SoapVar 对象。

<?php
$amount['_'] = 25;
$amount['currencyId'] = 'GBP';
$encodded = new SoapVar($amount, SOAP_ENC_OBJECT);

?>
和最终结果伤口是
<amount currencyId="GBP">25</amount> 
谢谢。

最佳答案

将属性放入 SOAP 元素有点麻烦。他们实现它的方式有点令人困惑。
首先要做的是将属性添加到 wsdl 文件 SoapServer用于正确读取和响应 SOAP 请求。

<xs:complexType name="encryptionContext">
<xs:simpleContent>
<xs:extension base="xs:string">
**<xs:attribute name="type" type="tns:encryptionType" />**
</xs:extension>
</xs:simpleContent>
</xs:complexType>
我们将不得不告诉 SoapServer通过在选项中将其作为 classmap 传递来使用 php 帮助程序类:
$soap_server = new \SoapServer($wsdl_file, array(
'cache_wsdl' => 1,
'trace' => true,
'classmap' => array('mediaCollection' => 'SoapMediaHelper')
));
我们在这里映射的是 SOAP 元素名称 mediaCollection到我们的一个类(class), SoapMediaHelper .我们现在可以返回一个 class,而不是返回数组。 ,在这种情况下,它被命名为 SoapMediaHelper .该类可以有soap-element=>value 对以及soap-attribute=>value 对。
假设我们已经创建了一个处理 mediaCollection 的类。 s,这告诉 SoapServer映射一个名为 SoapMediaHelper 的类到它。这个类非常简单:
class SoapMediaHelper
{
public function __construct(Array $properties = array())
{
foreach ($properties as $key => $value) {
$this->{$key} = $value;
}
}
}
必须填充此类的属性。这些属性应该是标记名=> 值对以及我们要添加到 mediaCollection 的属性的属性名称和值对。 . SoapServer将根据我们的 wsdl 文件找出哪个是哪个。
我们仍然需要填充这个对象,我们可以用另一个类来完成。
class SoapVarHelper
{
public function get($the_playlist, $playlist_id, $owned_by_user){
/* The SoapMediaHelper class is mapped to the mediaCollection wsdl.
* This is only needed to be able to set attributes on the XML nodes while using php's SoapServer
* */
$media_helper = new SoapMediaHelper($the_playlist);
/* For this type, the following xml attributes have to be set. (Not in the wsdl example above.) */
if($playlist_id === 'playlists'){
$media_helper->readOnly = false;
$media_helper->userContent = true;
$media_helper->renameable = false;
$media_helper->canDeleteItems = true;

}
if($owned_by_user){
$media_helper->readOnly = false;
$media_helper->userContent = false;
$media_helper->renameable = true;
$media_helper->canDeleteItems = true;
$media_helper->canReorderItems = true;
}
return new \SoapVar($media_helper, SOAP_ENC_OBJECT);
}
}
应该使用正常的标记名=> 值对调用此类。然后添加我们想要的属性。在这种情况下有条件。我们喂我们的 SoapMediaHelper反对 SoapVar . (我们之前告诉 SoapServer 这很好。)
现在我们需要做的最后一件事是,在我们的 mediaCollection 中类,使用助手 SoapVarHelper返回 SoapMediaHelper (我们之前告诉 SoapServer 的那个)。
在我们的 mediaCollection我们有一个函数 get_metadata_for_root :
public function get_metadata_for_root($user_id, $index, $count){
$titles = array(
'slides' => 'Featured',

);
$media_metadata = array();
foreach($titles as $key => $title){
$playlist = array(
'id' => $key,
'title' => $title,
'img' => $this->_utils->get_url() . '/public/sonos/images/browse-icons/icon-default-legacy.png'
);
**$media_metadata[] = $this->_soap_var_helper->get($playlist, $key, false);**
}
$res = array(
'count' => count($media_metadata),
'index' => 0,
'total' => count($media_metadata),
'mediaCollection' => $media_metadata
);
}
mediaCollection结果我们通过了 soap_var_helper确保不仅添加了 element=>value 对,而且还添加了我们想要的属性。
总结:
  • 确保你喂了 SoapServer使用 wsdl 文件,因此它知道元素和属性。
  • SoapServer选项添加 classmap为了告诉SoapServer当我们喂它一个 SoapMediaHelper 就可以了对象而不是常规输入。
  • 在响应请求之前,在这种情况下,mediaCollection ,通过 SoapMediaHelper 传递此响应. SoapVarHelper将所有 properties=>value 对映射为类属性,然后是 SoapMediaHelper将向其添加属性(也作为名称=> 值对)。
  • SoapServer将照顾其余的。
  • 关于PHP SoapVar 对象属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7223896/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com