MongoSaver::encodeProfile()   A
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 12
rs 9.8666
c 0
b 0
f 0
cc 3
nc 3
nop 1
1
<?php
2
3
namespace XHGui\Saver;
4
5
use MongoCollection;
6
use MongoDate;
7
use MongoId;
8
9
class MongoSaver implements SaverInterface
10
{
11
    /**
12
     * @var MongoCollection
13
     */
14
    private $_collection;
15
16
    public function __construct(MongoCollection $collection)
17
    {
18
        $this->_collection = $collection;
19
    }
20
21
    public function save(array $data, string $id = null): string
22
    {
23
        // build 'request_ts' and 'request_date' from 'request_ts_micro'
24
        $ts = $data['meta']['request_ts_micro'];
25
        $sec = $ts['sec'];
26
        $usec = $ts['usec'];
27
28
        $meta = [
29
            'url' => $data['meta']['url'],
30
            'get' => $data['meta']['get'],
31
            'env' => $data['meta']['env'],
32
            'SERVER' => $data['meta']['SERVER'],
33
            'simple_url' => $data['meta']['simple_url'],
34
            'request_ts' => new MongoDate($sec),
35
            'request_ts_micro' => new MongoDate($sec, $usec),
36
            'request_date' => date('Y-m-d', $sec),
37
        ];
38
39
        $a = [
40
            '_id' => new MongoId($id),
41
            'meta' => $meta,
42
            'profile' => $this->encodeProfile($data['profile']),
43
        ];
44
45
        $this->_collection->insert($a, ['w' => 0]);
46
47
        return (string)$a['_id'];
48
    }
49
50
    /**
51
     * MongoDB can't save keys with values containing a dot:
52
     *
53
     *   InvalidArgumentException: invalid document for insert: keys cannot contain ".":
54
     *   "Zend_Controller_Dispatcher_Standard::loadClass==>load::controllers/ArticleController.php"
55
     *
56
     * Replace the dots with underscrore in keys.
57
     *
58
     * @see https://github.com/perftools/xhgui/issues/209
59
     */
60
    private function encodeProfile(array $profile): array
61
    {
62
        $results = [];
63
        foreach ($profile as $k => $v) {
64
            if (strpos($k, '.') !== false) {
65
                $k = str_replace('.', '_', $k);
66
            }
67
            $results[$k] = $v;
68
        }
69
70
        return $results;
71
    }
72
}
73