Completed
Push — develop ( e2d101...8d74c2 )
by Mikaël
31:41
created

SoapClient::__doRequest()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 5
rs 9.4285
cc 1
eloc 3
nc 1
nop 5
1
<?php
2
3
namespace SoapClient;
4
5
/**
6
 * This class can be overridden at your will.
7
 * Its only purpose is to show you how you can use your own SoapClient client.
8
 */
9
class SoapClient extends \SoapClient
10
{
11
    /**
12
     * @var string
13
     */
14
    protected $lastModifiedRequest;
15
    /**
16
     * @param string $request
17
     * @param string $location
18
     * @param string $action
19
     * @param string $version
20
     * @param number $one_way
21
     * @return mixed
22
     */
23
    public function __doRequest($request, $location, $action, $version, $one_way = 0)
24
    {
25
        $this->removeEmptyTags($request);
26
        return parent::__doRequest($this->__getLastRequest(), $location, $action, $version, $one_way);
27
    }
28
    /**
29
     * Returns last request
30
     * @see SoapClient::__getLastRequest()
31
     * @return string
32
     */
33
    public function __getLastRequest()
34
    {
35
        return $this->lastModifiedRequest;
36
    }
37
    /**
38
     * Sets last request values
39
     * @param string $_lastRequest
0 ignored issues
show
Documentation introduced by
There is no parameter named $_lastRequest. Did you maybe mean $lastRequest?

This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function. It has, however, found a similar but not annotated parameter which might be a good fit.

Consider the following example. The parameter $ireland is not defined by the method finale(...).

/**
 * @param array $germany
 * @param array $ireland
 */
function finale($germany, $island) {
    return "2:1";
}

The most likely cause is that the parameter was changed, but the annotation was not.

Loading history...
40
     * @return string
41
     */
42
    public function __setLastRequest($lastRequest)
43
    {
44
        return ($this->lastModifiedRequest = $lastRequest);
45
    }
46
    /**
47
     * Removes empty tags from XML
48
     * @param string $xml
49
     * @param array $exceptTags
50
     * @return string
51
     */
52
    private function removeEmptyTags($xml, $exceptTags = array())
53
    {
54
        if (!empty($xml)) {
55
            $dom = new \DOMDocument('1.0', 'UTF-8');
56
            $dom->formatOutput = true;
57
            if ($dom->loadXML($xml) && $dom->hasChildNodes()) {
58
                $mainNode = $dom->childNodes->item(0);
59
                self::removeEmptyTagsFromDomNode($mainNode, $exceptTags);
60
                $xml = $dom->saveXML($mainNode);
61
            }
62
        }
63
        return $this->__setLastRequest($xml);
64
    }
65
    /**
66
     * Removes empty tags from \DOMNode
67
     * @uses RemoveEmptyRequestTags::removeEmptyTagsFromDomNode()
68
     * @param \DOMNode $domNode
69
     * @return void
70
     */
71
    private static function removeEmptyTagsFromDomNode(\DOMNode &$domNode, $exceptTags = array())
72
    {
73
        if ($domNode->hasChildNodes()) {
74
            foreach ($domNode->childNodes as $childNode) {
75
                self::removeEmptyTagsFromDomNode($childNode, $exceptTags);
76
            }
77
        } elseif (trim($domNode->nodeValue) === '' && !in_array($domNode->nodeName, $exceptTags) && $domNode->attributes->length === 0) {
0 ignored issues
show
Bug introduced by
The property length does not seem to exist in DOMNamedNodeMap.

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
78
            /**
79
             * As the parent might not have returned an empty value as it contained this child
80
             * we go process back the parent to be sure that he validated as not empty
81
             */
82
            $parentNode = $domNode->parentNode;
83
            $domNode->parentNode->removeChild($domNode);
84
            self::removeEmptyTagsFromDomNode($parentNode, $exceptTags);
85
        }
86
    }
87
}
88