Я поддерживаю предложение Александерс и Стефанс, но не буду подклассом SoapClient. Вместо этого я бы обернул обычный SoapClient в декораторе, потому что ведение журнала не является прямой задачей SoapClient. Кроме того, слабая связь позволяет вам легко заменить SoapClient макетом в ваших UnitTests, чтобы вы могли сосредоточиться на тестировании функциональности регистрации. Если вы хотите регистрировать только определенные вызовы, вы можете добавить некоторую логику, которая фильтрует запросы и ответы по $ action или как угодно.
Редактировать , поскольку Стефан предложил добавить некоторый код, декоратор, вероятно, будет выглядеть примерно так, хотя я не уверен насчет метода __call () (см. Комментарии Стефана)
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);
}
}