Foros del Web » Programando para Internet » PHP » Zend »

Zend_Soap, WSDL, y tipos complejos

Estas en el tema de Zend_Soap, WSDL, y tipos complejos en el foro de Zend en Foros del Web. Hola foro, Esta vez me toca a mi preguntar sobre algo a lo que no le encuentro solución. Mis dudas son especificamente 3. Empecemos con ...
  #1 (permalink)  
Antiguo 07/12/2011, 09:40
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 15 años, 8 meses
Puntos: 416
Zend_Soap, WSDL, y tipos complejos

Hola foro,

Esta vez me toca a mi preguntar sobre algo a lo que no le encuentro solución.

Mis dudas son especificamente 3. Empecemos con lo que quiero:

Quiero hacer un WebService con Zend_Soap para que una aplicacion web provea cierta informacion y yo poder interactuar desde otros lenguajes (como Java).

Ejemplo:

Tengo esto:
Código PHP:
<?php

class WebServiceController extends Zend_Controller_Action {
    
    public function 
init() {
        
$this->_helper->layout()->disableLayout();
        
ini_set("soap.wsdl_cache_enabled""0");
    }
    
    public function 
indexAction() {
        
$this->_helper->viewRenderer->setNoRender(true);
        
        if(isset(
$_GET['wsdl'])) {
            
$wsdlServer = new Zend_Soap_AutoDiscover('Zend_Soap_Wsdl_Strategy_ArrayOfTypeComplex');
            
$wsdlServer->setOperationBodyStyle(
                array(
                    
'use' => 'literal'
                
)
            );
            
$wsdlServer->setBindingStyle(
                array(
                    
'style' => 'document'
                
)
            );
            
            
$wsdlServer->setClass('Application_Model_ZendWebService');
            
$wsdlServer->handle();
        } else {
            
$wsdlServer = new Zend_Soap_Server('http://proyecto.local/webservice?wsdl');
            
$wsdlServer->setClass('Application_Model_ZendWebService');
            
$wsdlServer->setObject(new Application_Model_ZendWebService());
            
$wsdlServer->handle();
        }
        
    }
    
}
En mi modelo, para simplificar, tengo esto:
Código PHP:
<?php

class Application_Model_ZendWebService implements Application_Model_WebService {
    
/**
     * Regresa una lista de categorias (Application_Model_User)
     * @return Application_Model_User[]
     */
    
public function getUsers() {
        return array(new 
Application_Model_User());
    }
}
La clase Application_Model_User es algo como esto:
Código PHP:
<?php

class Application_Model_User {
    private 
$userame;
    private 
$password;
    private 
$brothers = array();
    
    public function 
getUsername() {
        return 
$this->username;
    }
    public function 
getPassword() {
        return 
$this->password;
    }
    public function 
getBrothers() {
        return 
$this->brothers;
    }
//Setters debajo
}
Al usar tipos complejos entonces necesito agregar el comentario phpDoc @var a las propiedades para que Zend_Soap pueda autodescubrir las clases.
Sin embargo, aun cuando agrego el comentario @var, no se muestra en mi WSDL las propiedades. Para que sea mostrado tengo que definir mi variable como PUBLIC, lo cual rompe la encapsulacion que tengo en mi codigo.

1era pregunta:
¿Puedo hacer que se vean las variables aun sean definidas como private? Ya sea llamando al metodo o algo parecido.

2da duda:
Como tengo mi clase ZendWebService ahora mismo, que el metodo retorne un array de Application_Model_User(), cuando intento generar un Stub con un programa llamado Wireless Toolkit para Java, me dice que el metodo getUsers contiene tipos desconocidos. Si quito que se retorne un array y que solo retorne 1 objeto, funciona bien. ¿El problema es mio o del Wireless Toolkit?

3ra duda:
Cuando hago una referencia a la misma clase ocurre algo raro, es decir, cuando tengo:
/** @var Application_Model_User[] */
public $brothers = array();
El WSDL generado repite el tipo complejo Application_Model_User y por lo tanto el WTK no me deja generar el Stub porque aparece repetido el tipo.

¿Como hago una referencia a la misma clase correctamente?

Etiquetas: clase, php, wsdl, tipo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:15.