Pour mon boulot, j’ai besoin de mettre un objet en session qui contient lui-même un objet SoapClient. le problème, c’est que sur la page suivante, la connexion au serveur SOAP est coupée. Il faut reconnecter le client à la main… c’est un peu casse pied.
Du coup, j’ai étendu la classe SoapClient pour que ca se reconnecte automatiquement et ca donne:
class SoapClientSessionnable extends SoapClient { private $wsdl; private $options; public function __construct($wsdl, $options = array()) { $this->wsdl = $wsdl; $this->options = $options; parent::__construct($wsdl, $options); } public function __wakeup() { $this->__construct($this->wsdl, $this->options); } }
Bon, c’est un peu crade de rappeler le constructeur, mais je n’ai trouvé aucune méthode qui connecte le client SOAP… et puis ca a le mérite de fonctionner :)
Du coup, ca s’utilise de la même façon que le client SOAP de base:
$client = new SoapClientSessionnable( 'http://host.com/path/to/wsdl', array( // Options 'trace' => 1, 'soap_version' => SOAP_1_1, .... ) );
Pensez quand même à mettre $client en session pour qu’il soit réutilisable dans la page suivante :)






16 février 2008 16h03
Tu devrais te renseigner au sujet des Design Pattern, et dans ton cas, du Singleton.. C’est quasiment ce que tu as fais..
18 février 2008 14h40
Pas du tout, non.
je ne cherche pas à avoir une seul instance de la classe SoapClient, je cherche à avoir une reconnexion automatique au « réveil », c’est à dire lorsque l’instance en question est recréée par la session qui se relance, dans la page suivante.
Il peut tout a fait y avoir 26 instances SoapClient(Sessionnable), ca n’est pas le problème.
17 septembre 2008 08h59
Eh bien fait une classe qui encapsule le client SOAP ! Un genre de « factory ».
21 octobre 2008 15h45
C’est une idée vraiment simpa en tout cas pour garder Soap en session :), merci :)
9 janvier 2009 15h31
Pour stocker la variable objet en session il est bien entenu nécessaire de la sérialiser ;)
merci pour ton code !