Response   A
last analyzed

Complexity

Total Complexity 13

Size/Duplication

Total Lines 57
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 13
c 1
b 0
f 0
lcom 1
cbo 1
dl 0
loc 57
rs 10

4 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A body() 0 4 1
C json() 0 28 8
A parseXmlContent() 0 13 3
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()
19
    {
20
        return (string) $this->response->getBody();
21
    }
22
23
    public function json()
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($content->nodeValue);
47
            }
48
        }
49
        return [];
50
    }
51
52
    private function parseXmlContent($xml)
53
    {
54
        $xml = trim($xml);
55
        if (strncmp($xml, '<', 1) !== 0) {
56
            return ['error' => $xml];
57
        }
58
        $xml = new \SimpleXMLElement($xml);
59
        $obj = json_decode(json_encode($xml));
60
        foreach ($obj as $param => $value) {
61
            return $value;
62
        }
63
        return null;
64
    }
65
}
66