PHP SoapVar 对象属性?

时间:2023-02-11
本文介绍了PHP SoapVar 对象属性?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

有没有人知道如何向 SoapVar 对象添加属性?看起来这很简单,但我无法接受/工作.

我查看了 PHP 文档和以下 stackoverflow 问题:

关于 SoapVar 的文档,

stackoverflow 问题:SoapVar/Param 和 SOAP 中的嵌套重复元素

我正在尝试添加一个像这个数组示例一样的属性,但使用复杂的 SoapVar 对象.

最终结果是

25

谢谢.

解决方案

在 SOAP 元素中获取属性有点麻烦.他们实施的方式有点令人困惑.

首先要做的是将属性添加到 SoapServer 用来正确读取和响应 SOAP 请求的 wsdl 文件.

<xs:simpleContent><xs:extension base=xs:string">**

我们必须告诉 SoapServer 使用一个 php 帮助类,方法是将它作为 classmap 传递到选项中:

$soap_server = new SoapServer($wsdl_file, array('cache_wsdl' =>1、'跟踪' =>真的,'类图' =>数组('mediaCollection' => 'SoapMediaHelper')));

我们在这里映射的是 SOAP 元素名称 mediaCollection 到我们的一个类 SoapMediaHelper.我们现在可以返回一个 class,而不是返回数组,在这种情况下,它被命名为 SoapMediaHelper.该类可以具有soap-element=>值对以及soap-attribute=>值对.

假设我们已经创建了一个处理 mediaCollection 的类,这会告诉 SoapServer 将一个名为 SoapMediaHelper 的类映射到它.这个类真的很简单:

class SoapMediaHelper{公共函数 __construct(Array $properties = array()){foreach ($properties as $key => $value) {$this->{$key} = $value;}}}

必须填充此类的属性.这些属性应该是 tagname=>value 对以及我们想要添加到 mediaCollection 的属性的属性名称和值对.SoapServer 将根据我们的 wsdl 文件找出哪个是哪个.

我们仍然需要填充这个对象,我们可以用另一个类来完成.

class SoapVarHelper{公共函数 get($the_playlist, $playlist_id, $owned_by_user){/* SoapMediaHelper 类映射到 mediaCollection wsdl.* 只需要在使用 php 的 SoapServer 时能够在 XML 节点上设置属性* */$media_helper = new SoapMediaHelper($the_playlist);/* 对于这种类型,必须设置以下 xml 属性.(不在上面的 wsdl 示例中.)*/if($playlist_id === '播放列表'){$media_helper->readOnly = false;$media_helper->userContent = true;$media_helper->renameable = false;$media_helper->canDeleteItems = true;}如果($owned_by_user){$media_helper->readOnly = false;$media_helper->userContent = false;$media_helper->renameable = true;$media_helper->canDeleteItems = true;$media_helper->canReorderItems = true;}返回新的 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 = 数组('幻灯片' =>'精选',);$media_metadata = array();foreach($titles as $key => $title){$播放列表=数组('id' =>$key,'标题' =>$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 = 数组('计数' =>计数($media_metadata),'索引' =>0,'总计' =>计数($media_metadata),'mediaCollection' =>$media_metadata);}

对于每个 mediaCollection 结果,我们通过 soap_var_helper 传递它以确保不仅添加了 element=>value 对,而且还添加了我们想要的属性

总结:

  1. 确保为 SoapServer 提供 wsdl 文件,以便它知道元素和属性.

  2. SoapServer 选项中添加 classmap 以告诉 SoapServer 当我们给它一个 SoapMediaHelper 对象而不是常规输入.

  3. 在响应请求之前,在本例中为 mediaCollection,通过 SoapMediaHelper 传递此响应.SoapVarHelper 将所有 properties=>value 对映射为类属性,然后 SoapMediaHelper 将向其添加属性(也作为 name=>value 对).

  4. SoapServer 会处理剩下的事情.

Does anyone have any clue as to how I can add an attribute to a SoapVar object? It seems like it would be simple, but I can't get it to take/work.

I've looked at the PHP docs and at the following stackoverflow question:

Documentation on SoapVar,

stackoverflow question: SoapVar/Param and nested, repeated elements in SOAP

I'm trying to add an attribute like this array example, but using complex SoapVar objects instead.

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

?>

and end result wound be

<amount currencyId="GBP">25</amount> 

Thanks.

解决方案

Getting attributes into SOAP elements is a bit of a hassle. The way they implemented it is a bit confusing.

First thing to do is add the attributes to the wsdl file that SoapServer uses to correctly read and respond to the SOAP requests.

<xs:complexType name="encryptionContext">
    <xs:simpleContent>
        <xs:extension base="xs:string">
            **<xs:attribute name="type" type="tns:encryptionType" />**
        </xs:extension>
    </xs:simpleContent>
</xs:complexType>

We will have to tell SoapServer to use a php helper class by passing it in the options as classmap:

$soap_server = new SoapServer($wsdl_file, array(
    'cache_wsdl' => 1,
    'trace' => true,
    'classmap' => array('mediaCollection' => 'SoapMediaHelper')
));

What we are mapping here is the SOAP element name mediaCollection to one of our classes, SoapMediaHelper. Instead of returning arrays, we can now return a class, in this case, it's named SoapMediaHelper. The class can have soap-element=>value pairs as well as soap-attribute=>value pairs.

Assuming we already have made a class that handles mediaCollections, this tells SoapServer to map a class called SoapMediaHelper to it. The class is really simple:

class SoapMediaHelper
{
    public function __construct(Array $properties = array())
    {
        foreach ($properties as $key => $value) {
            $this->{$key} = $value;
        }
    }
}

The properties of this class have to be populated. These properties should be both the tagname=>value pairs as well as the attribute name and value pair(s) for the attributes we want to add to our mediaCollection. SoapServer will figure out which is which according to our wsdl file.

We will still have to populate this object, which we can do with yet another class.

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);
    }
}

This class should be called with the normal tagname=>value pairs. It then adds the attributes we want. In this case conditionally. We feed our SoapMediaHelper object to SoapVar. (We told SoapServer earlier that this is fine.)

Now the last thing we need to do is, in our mediaCollection class, to use the helper SoapVarHelper to return a SoapMediaHelper (the one we told SoapServer about earlier).

In our mediaCollection we have a function 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
    );
}

For every mediaCollection result we pass it through the soap_var_helper to make sure not only the element=>value pairs are added, but also the attributes that we want on it.

TO SUMMARIZE:

  1. Make sure you feed the SoapServer with a wsdl file, so it know the elements and the attributes.

  2. In the SoapServer options add classmap in order to tell SoapServer that it is fine when we feed it a SoapMediaHelper object instead of the regular input.

  3. Before responding to a request for, in this case, mediaCollection, pass this response through the SoapMediaHelper. The SoapVarHelper will map all the properties=>value pairs as class properties, then the SoapMediaHelper will add attributes (also as name=>value pairs) to it.

  4. SoapServer will take care of the rest.

这篇关于PHP SoapVar 对象属性?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!