Ver Mensaje Individual
  #4 (permalink)  
Antiguo 03/08/2009, 09:10
Avatar de Snaft_J1
Snaft_J1
 
Fecha de Ingreso: diciembre-2006
Mensajes: 285
Antigüedad: 18 años, 3 meses
Puntos: 8
Mensaje Respuesta: Acceso a un Statefull WS desde PHP

tengo entendido que en hay problemas con la extension SOAP de php5 para la transferencia de objetos u objetos anidados, el caso es que aqui te muestro una de las tantas formas de solucionarlo.

Código PHP:
<?php

abstract class SoapWrapper {
    public function 
getAsSOAP() {
        foreach(
$this as $key=>&$value) {
            
$this->prepareSOAPrecursive($this->$key);
        }
        return 
$this;
    }

    private function 
prepareSOAPrecursive(&$element) {
        if(
is_array($element)) {
            foreach(
$element as $key=>&$val) {
                
$this->prepareSOAPrecursive($val);
            }
            
$element=new SoapVar($element,SOAP_ENC_ARRAY);
        }elseif(
is_object($element)) {
            if(
$element instanceof SoapWrapper) {
                
$element->getAsSOAP();
            }
            
$element=new SoapVar($element,SOAP_ENC_OBJECT);
        }
    }

// ------------------------------------------
//  Ejemplo de uso
// ------------------------------------------

class PersonList extends SoapWrapper {
    protected 
$ArrayOfPerson
}

class 
Person extends SoapWrapper {


$client=new SoapClient("demo.wsdl", array( 'soap_version'=>SOAP_1_2'trace'=>1'classmap' => array('Person' => "Person"'PersonList' => "PersonList")  ));
$PersonList=new PersonList;
$PersonList->getAsSOAP();

//Continuas aqui con tus metodos u operaciones.

?>
por tanto, cada clase que necesite realizar transferencias via SOAP, deberá extender desde SoapWrapper.

Como puedes ver, en el código anterior, la función prepareSOAPrecursive busca objetos anidados en los nodos padres o en arreglos de objetos, de ser asi, entonces intenta llamar a la funcion getAsSOAP() para preparar los objetos anidados y pasar por el SoapVar.

lo unico que tendras que hacer es siempre antes de transmitir $ obj-> getAsSOAP () y listo.

Enjoy it!...