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