Php 自动发现不尊重Zend Framework类映射?
我使用ZendFramework在Wordpress中创建了一个完整的插件,现在我想公开一个Web服务来访问数据,因为我需要创建一个c#导入应用程序 我面临的问题是,即使我将webservice返回的类型设置为特定的类型,类映射也不会启动并转换该类型。例如:Php 自动发现不尊重Zend Framework类映射?,php,web-services,zend-framework,soap,autodiscovery,Php,Web Services,Zend Framework,Soap,Autodiscovery,我使用ZendFramework在Wordpress中创建了一个完整的插件,现在我想公开一个Web服务来访问数据,因为我需要创建一个c#导入应用程序 我面临的问题是,即使我将webservice返回的类型设置为特定的类型,类映射也不会启动并转换该类型。例如: /** * Retursn all events registered on the sgm web interface * * @return models_event[] */ public function getAllEv
/**
* Retursn all events registered on the sgm web interface
*
* @return models_event[]
*/
public function getAllEvents(){
return models_event::getEvents();
}
定义在models_事件数组中返回的类。如果我启动WSDL部分,我会得到一个添加为“models\u event”的复杂类型,但问题是:
$autodiscover = new Zend_Soap_AutoDiscover(array(
'classmap' => array(
'event' => "models_event",
),
'encoding' => 'utf-8'
));
$autodiscover->setComplexTypeStrategy(new Zend_Soap_Wsdl_Strategy_ArrayOfTypeComplex());
$autodiscover->setClass('models_webservice');
$autodiscover->handle();
I类将模型映射到事件。因此,我的WSDL应该导出复杂类型:
<xsd:complexType name="ArrayOfmodels_event">
<xsd:complexContent>
<xsd:restriction base="soap-enc:Array">
<xsd:attribute ref="soap-enc:arrayType" wsdl:arrayType="tns:models_event[]"/>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="models_event">
<xsd:all/>
</xsd:complexType>
但正如您所看到的,它正在返回一个models\u event[]complexe类型和models\u event复杂类型。。。我都搞砸了。。。为什么要这样做?您使用的是哪个版本的Zend Framework 在我正在查看的版本(1.11.10)中,
Zend\u Soap\u AutoDiscover
没有将选项数组作为构造函数参数之一。构造函数的方法签名如下所示:
public function __construct($strategy = true, $uri=null, $wsdlClass=null)
您所指的classmap
选项位于Zend_Soap_Server
中,在我看来,它的存在主要是因为Zend_Soap_Server主要只是PHP的原生SoapServer
类的包装器,因此它的接口允许您访问底层类提供的所有选项。我还猜测,classmap
选项的存在是为了解决一个稍微不同的问题,即您正在基于预先存在的WSDL构建SOAP服务器,并且希望将WSDL名称映射到内部PHP类名
我的建议是将
models\u event
类重命名为event
(或者更好的是,event
),这将有望让您更接近WSDL中所要查找的内容。谢谢您的回答,但我无法重命名该类,因为它是我使用Zend Autoloader的自动加载策略的一部分。关于类映射,必须有一种方法传递到自动发现,因为这样WSDL将与服务器返回的类不匹配。我不是说你错了,但这里肯定有我们遗漏的东西……我理解你关于不能重命名类的说法。在我的实现中,我有一个以正确的Zend MVC风格实现的控制器,但它使用require_once()
拖入调用setClass()
时使用的类。我还想补充的是,自动发现
类似乎完全脱离了您提供的实际类或函数。例如,setClass()
方法似乎只是使用反射来计算WSDL的内容。似乎没有任何工具允许将名称从类中的方法名称映射到任意一组函数名称。因此,我认为使用require\u once()
手动重命名类并将其拖入可能是您唯一的选择。或者您可以将类映射功能添加到Zend\u Soap\u AutoDiscover
:-)