Completed
Push — master ( 65e840...33fe4c )
by Gabriel
03:16
created

Response::json()   C

Complexity

Conditions 8
Paths 27

Size

Total Lines 28
Code Lines 18

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 28
rs 5.3846
c 0
b 0
f 0
cc 8
eloc 18
nc 27
nop 0
1
<?php
2
3
namespace ThreePlCentral;
4
5
use DOMDocument;
6
use DOMText;
7
use Psr\Http\Message\ResponseInterface;
0 ignored issues
show
Bug introduced by
This use statement conflicts with another class in this namespace, ThreePlCentral\ResponseInterface.

Let’s assume that you have a directory layout like this:

.
|-- OtherDir
|   |-- Bar.php
|   `-- Foo.php
`-- SomeDir
    `-- Foo.php

and let’s assume the following content of Bar.php:

// Bar.php
namespace OtherDir;

use SomeDir\Foo; // This now conflicts the class OtherDir\Foo

If both files OtherDir/Foo.php and SomeDir/Foo.php are loaded in the same runtime, you will see a PHP error such as the following:

PHP Fatal error:  Cannot use SomeDir\Foo as Foo because the name is already in use in OtherDir/Foo.php

However, as OtherDir/Foo.php does not necessarily have to be loaded and the error is only triggered if it is loaded before OtherDir/Bar.php, this problem might go unnoticed for a while. In order to prevent this error from surfacing, you must import the namespace with a different alias:

// Bar.php
namespace OtherDir;

use SomeDir\Foo as SomeDirFoo; // There is no conflict anymore.
Loading history...
8
9
class Response implements \ThreePlCentral\ResponseInterface
10
{
11
    private $response;
12
13
    public function __construct(ResponseInterface $response)
14
    {
15
        $this->response = $response;
16
    }
17
18
    public function body(): string
19
    {
20
        return (string) $this->response->getBody();
21
    }
22
23
    public function json(): array
24
    {
25
        $body = $this->body();
26
        $xml = new DOMDocument( "1.0", "ISO-8859-15" );
27
        $xml->loadXML($body);
28
29
        $body = null;
30
        foreach($xml->firstChild->childNodes as $node) {
31
            if (!($node instanceof DOMText) && $node->tagName === 'soap:Body') {
32
                $body = $node;
33
                break;
34
            }
35
        }
36
37
        if ($body) {
38
            $content = null;
39
            foreach($body->childNodes as $node) {
40
                if (!($node instanceof DOMText)) {
41
                    $content = $node;
42
                    break;
43
                }
44
            }
45
            if ($content) {
46
                return $this->parseXmlContent(trim($content->nodeValue));
47
            }
48
        }
49
        return [];
50
    }
51
52
    private function parseXmlContent(string $xml)
53
    {
54
        $xml = new \SimpleXMLElement($xml);
55
        $obj = json_decode(json_encode($xml));
56
        foreach($obj as $param => $value) {
57
            return $value;
58
        }
59
    }
60
}
61