Ich zweite Aleksanders und Stefans Vorschlag aber würde nicht SoapClient Unterklasse. Stattdessen würde ich den regulären SoapClient in einen Decorator einbinden, da die Protokollierung kein direktes Anliegen des SoapClients ist. Mit der losen Kopplung können Sie den SoapClient in Ihren UnitTests leicht durch einen Schein ersetzen, sodass Sie sich auf das Testen der Protokollierungsfunktionen konzentrieren können. Wenn Sie nur bestimmte Anrufe protokollieren möchten, können Sie eine Logik hinzufügen, die Anfragen und Antworten nach $ action oder nach allen Kriterien sortiert, die Sie für richtig halten.
bearbeiten seit Stefan vorgeschlagen, einige Code zu schreiben, würde der Dekorateur wahrscheinlich in etwa so aussehen, obwohl ich über die __call() -Methode nicht sicher bin (siehe Stefans Kommentare)
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);
}
}
Die Verwendung eines Dekorators ist eine sehr gute Idee. Eigentlich würde ich selbst mit einer Decorator-Lösung gehen, wenn ich an dem gleichen Problem arbeiten müsste. Aber ich denke, die Unterklassen-Lösung ist ein bisschen verständlicher. –
Vielleicht hilft es dem OP, wenn Sie ein Codebeispiel hinzufügen. –
Und dann gibt es ein PHP-Problem, das das * Stacking * von Decorators nicht zulässt, wenn Sie das Methoden-Überladungs-Feature '__call()' in einem Ihrer Decorators oder in der zu dekorierenden Klasse verwenden ('SoapClient' in diesem) Fall). –