Passed
Pull Request — master (#754)
by Songda
01:52
created

XmlPacker   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 35
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 7
eloc 17
c 1
b 0
f 0
dl 0
loc 35
rs 10

2 Methods

Rating   Name   Duplication   Size   Complexity  
A pack() 0 12 3
A unpack() 0 19 4
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Yansongda\Pay\Packer;
6
7
use Yansongda\Pay\Contract\PackerInterface;
8
9
class XmlPacker implements PackerInterface
10
{
11
    public function pack(array $payload): string
12
    {
13
        $xml = '<xml>';
14
15
        foreach ($payload as $key => $val) {
16
            $xml .= is_numeric($val) ? '<'.$key.'>'.$val.'</'.$key.'>' :
17
                                       '<'.$key.'><![CDATA['.$val.']]></'.$key.'>';
18
        }
19
20
        $xml .= '</xml>';
21
22
        return $xml;
23
    }
24
25
    public function unpack(string $payload): ?array
26
    {
27
        if (empty($payload)) {
28
            return [];
29
        }
30
31
        if (PHP_VERSION_ID < 80000) {
32
            libxml_disable_entity_loader();
33
        }
34
35
        $data = json_decode(json_encode(
36
            simplexml_load_string($payload, 'SimpleXMLElement', LIBXML_NOCDATA), JSON_UNESCAPED_UNICODE
37
        ), true);
38
39
        if (JSON_ERROR_NONE === json_last_error()) {
40
            return $data;
41
        }
42
43
        return null;
44
    }
45
}
46