Sto comunicando con un'API SOAP utilizzando PHP SOAPClient class. Una delle opzioni ci consente di rimappare i tipi specificati nel file WSDL con le proprie classi:Il costruttore non viene chiamato dall'oggetto risposta SOAP
The classmap option can be used to map some WSDL types to PHP classes. This option must be an array with WSDL types as keys and names of PHP classes as values.
Creo il mio cliente in quanto tale:
$api = new SOAPClient('http://example.com/soap.wsdl', [
'location' => 'http://example.com/soap/endpoint',
'soap_version' => SOAP_1_2,
'compression' => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP,
'cache_wsdl' => WSDL_CACHE_BOTH,
'classmap' => [
'APIResultObject' => 'Result'
],
# TODO: Set for debug only?
'trace' => TRUE,
'exceptions' => TRUE
]);
Questo funziona e quando chiamo $api->method('param')
, ho ottenere un oggetto Result
indietro (anziché solo un oggetto StdClass
). Il problema è che il metodo Result::__construct()
non viene mai chiamato, quindi alcune proprietà private di Result
non vengono mai impostate.
Ecco cosa Result
è:
class DataClass{
protected $data;
function __construct(){
$this->data = ['a' => 0, 'b' => 1, 'c' => 2];
}
}
class Result extends DataClass{
public $value, $name, $quantity;
function __construct(array $values){
parent::__construct();
foreach(['value', 'name', 'quantity'] as $var){
$this->$var = isset($values[$var]) ? $values[$var] : NULL;
}
}
function getData(){
return $this->data[$this->name];
}
}
Quello che sta succedendo è che sto facendo $api->method('param')->getData()
e ottenere il seguente errore:
Notice: Undefined property: Result::$data
Come posso chiamare la funzione di costruzione che ho bisogno di quando ottenere un SOAP risposta? Ho provato a utilizzare __wakeup()
, ma non sembrava funzionare.
P.S. L'ho "risolto" con una piccola soluzione, ma non penso sia l'ideale. Ecco quello che ho fatto:
function getData(){
if($this->data === NULL){
parent::__construct();
}
return $this->data[$this->name];
}
Ciao, im solo curioso come chiami la funzione getData quando usi $ api-> method ('param') -> getName()? Non mi sottovalutare, voglio solo imparare qualcosa ... pensavo che la classe dovesse avere il nome del metodo per il metodo da chiamare, ma posso vedere lì qualsiasi metodo getName() ecco perché sto chiedendo ... Thx in anticipo per la tua risposta :-) – Redrif
@Redrif: Era solo un piccolo refuso, mi dispiace. Ho provato a copiare e incollare questo dal mio codice reale (e cambiare i nomi delle cose). Questo dovrebbe essere in realtà il metodo $ $ api-> ('param') -> getData() '. Nessuna magia qui, solo un refuso nella domanda. –