• Как сделать Soap Server на PHP что бы он поддерживал стандарт ws-i?

    @AlexBoo Автор вопроса
    Решил данную проблему добавив к модели специальный Proxy класс, который переобразует входящие и исходящие данные к серверу.

    class Service_SoapProxy
    {
        protected $_service;
        
        public function __construct()
        {
            $this->_service = new Model_Soap();
        }
        
        public function __call($name, $arguments)
        {
            $params = array();
    	
            if(count($arguments) > 0){
    	    
                foreach($arguments[0] as $property=>$value){
                    $params[$property] = $value;
                }
    	    
            }
    	
            $result = call_user_func_array(array($this->_service, $name), $params);
    	
            return array("{$name}Result" => $result);
        }
    }
    


    После этого Soap сервер стал выглядеть следующим образом:

    if ( $wsdl !== null ) {	    
        $autodiscover = new Zend_Soap_AutoDiscover('Zend_Soap_Wsdl_Strategy_ArrayOfTypeSequence');
        $autodiscover->setBindingStyle(array('style'=>'document'));
        $autodiscover->setOperationBodyStyle(array('use' => 'literal'));
        $autodiscover->setClass('Model_Soap');
        $autodiscover->handle();
    }
    elseif ($request -> isPost()) {
    
        // Request soap
        if (! empty($this -> key)) {
            $wsdl = 'http://' . $hostname . '/api2/' . (is_array($this -> key) ? $this -> key['key'] : $this -> key) . '?wsdl';
        }
        else
            $wsdl = 'http://' . $hostname . '/api2/?wsdl';
    					
        $server = new Zend_Soap_Server($wsdl, array('cache_wsdl'=>false));
        $modelSoap = new Service_SoapProxy();
        $server->setObject($modelSoap);
        $server->handle();
    }
    


    Правда после этих изменений php не может работать с данным SOAP сервером, работать с ним может только .NET
    Ответ написан
    Комментировать