Tüm Sabun istek ve PHP yanıtları açılıyor

4 Cevap php

Herkes PHP yerleşik SoapClient ile tüm istek ve yanıtları günlüğe nasıl biliyor mu? Ben aslında elle SoapClient::__getLastRequest() ve SoapClient::__getLastResponse() ile her oturum olabilir Ama ben diğer olasılıkları bizim sistemimizde çok sabun istekleri arıyorum o var.

Not: Ben bu kadar SoapClient::__soapCall() bir seçenek değildir, tüm kadar tünelleri bir yöntemi kullanarak Wsdl modunu kullanıyorum

4 Cevap

Ben ikinci Aleksanders ve Stefans öneri ama SoapClient alt sınıf olmaz. Günlük SoapClient doğrudan bir endişe değildir çünkü onun yerine ben, bir dekoratör düzenli SoapClient sarın ediyorum. Buna ek olarak, gevşek bağlama kolayca unittests bir mock ile SoapClient yerine sağlar, böylece günlük işlevselliğini test konsantre olabilirsiniz. Eğer sadece belirli çağrıları oturum açmak istiyorsanız, size $ eylem veya uygun gördüğünüz herhangi bir şey tarafından istekleri ve yanıtları filtreler bazı mantık ekleyebilirsiniz.

Stefan bazı kod eklemek için önerilen beri __ çağrısı hakkında emin değilim ancak Edit, dekoratör (muhtemelen, böyle bir şey olmazdı) yöntemi (Stefans yorumlara bakınız)

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);
    }
}

Ben daha iyi bir yol SoapClient::__doRequest() geçersiz kılmak (ve SoapClient::__soapCall()) Eğer istek yanı sıra tepki-XML doğrudan erişim gerekecek gibi olduğunu düşünüyorum. Ancak alt sınıf genel yaklaşım SoapClient gitmek için bir yol olmalıdır.

class My_LoggingSoapClient extends SoapClient
{
    // logging methods

    function __doRequest($request, $location, $action, $version, $one_way = 0) 
    {
        $this->_logRequest($location, $action, $version, $request);
        $response = parent::__doRequest($request, $location, $action, $version, $one_way);
        $this->_logResponse($location, $action, $version, $response);
        return $response;
    }
}

EDIT

Görünümünde bir OOP-design / design pattern noktasından bir Decorator Açıkçası bu tür bir sorunu işlemek için iyi bir yoldur - lütfen Gordon's answer. Ama bu uygulamak için biraz daha zordur.

Bu eski bir yazı tekrar, ama ben Sabun istekleri kaydedilmesine sorumludur ve durumda paylaşmak istedim bir dekoratör kabul kargılık uygulama ile bazı zorlukları karşılaştı Maalesef başkasının bu geçmektedir.

Eğer kabul edilen yanıt özetlenen SoapClientLogger sınıfını kullanarak, aşağıdaki gibi bir örneğini kurmak düşünün.

$mySoapClient = new SoapClientLogger(new SoapClient());

Muhtemelen sen SoapClientLogger örneğinde çağrı herhangi bir yöntem __ call () yöntemi ile geçti ve SoapClient yürütülür alacak. Ancak, genellikle bu gibi WSDL oluşturulan yöntemlerini çağırarak bir SoapClient faydalanmak:

$mySoapClient->AddMember($parameters); // AddMember is defined in the WSDL

Bu kullanım SoapClientLogger en _doRequest () yöntemini isabet asla ve böylece isteği günlüğe olmayacaktır. Bunun yerine AddMember () sağda SoapClient örneğinin _doRequest yöntemine sonra aşağı :: $ mySoapClient yönlendirilir _call () ve.

Ben hala bu kadar zarif bir çözüm arıyorum.

Olur bu iş böyle bir şey?

class MySoapClient extends SoapClient
{
    function __soapCall($function_name, $arguments, $options = null, $input_headers = null, &$output_headers = null) 
    {
        $out = parent::__soapCall($function_name, $arguments, $options, $input_headers, $output_headers);

        // log request here...
        // log response here...

        return $out;
    }
}

SoapClient zaten __ soapCall aracılığıyla tüm istekleri gönderir olduğundan, SoapClient sınıflara ve geçersiz kılma bunları müdahale edebilirsiniz. Tabii ki, o iş yapmak için de new MySoapClient(...) ile kodunda her new SoapClient(...) değiştirmeniz gerekiyor, ama bu oldukça kolay bir arama gibi görünüyor ve görev değiştirin.