I secondo suggerimento di Aleksanders e Stefans ma non sottoclasse SoapClient. Invece avrei avvolto il normale SoapClient in un decoratore, perché la registrazione non è una preoccupazione diretta di SoapClient. Inoltre, l'accoppiamento libero consente di sostituire facilmente SoapClient con una simulazione nei tuoi Unit Test, così puoi concentrarti sul test della funzionalità di registrazione. Se desideri registrare solo chiamate specifiche, puoi aggiungere una logica che filtra richieste e risposte in base a $ azione o qualsiasi cosa tu ritenga opportuno.
Modifica poiché Stefan ha suggerito di aggiungere del codice, il decoratore sarebbe probabilmente guardare qualcosa di simile, anche se non sono sicuro circa il metodo __call() (vedi commenti Stefans)
class SoapClientLogger
{
protected $soapClient;
// wrapping the SoapClient instance with the decorator
public function __construct(SoapClient $client)
{
$this->soapClient = $client;
}
// Overloading __doRequest with your logging code
function __doRequest($request, $location, $action, $version, $one_way = 0)
{
$this->log($request, $location, $action, $version);
$response = $this->soapClient->__doRequest($request, $location,
$action, $version,
$one_way);
$this->log($response, $location, $action, $version);
return $response;
}
public function log($request, $location, $action, $version)
{
// here you could add filterings to log only items, e.g.
if($action === 'foo') {
// code to log item
}
}
// route all other method calls directly to soapClient
public function __call($method, $args)
{
// you could also add method_exists check here
return call_user_func_array(array($this->soapClient, $method), $args);
}
}
L'uso di un decoratore è un'ottima idea. In realtà, se dovessi lavorare sullo stesso problema, andrei con una soluzione decoratrice. Ma penso che la soluzione di sottoclassi sia un po 'più comprensibile. –
Forse aiuterà l'OP se aggiungi un esempio di codice. –
E poi c'è un problema PHP che disabilita lo * stacking * dei decoratori se stai usando la funzione di overloading dei metodi '__call()' in uno dei tuoi decoratori o nella classe da decorare ('SoapClient' in questo Astuccio). –