ExtendFromDefaults::buildUniqueMetaKey()   A
last analyzed

Complexity

Conditions 4
Paths 4

Size

Total Lines 14
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 4
eloc 7
nc 4
nop 1
dl 0
loc 14
rs 10
c 0
b 0
f 0
1
<?php
2
declare(strict_types = 1);
3
4
namespace Norsys\SeoBundle\DependencyInjection\Config;
5
6
/**
7
 * Class ExtendFromDefaults
8
 */
9
class ExtendFromDefaults
10
{
11
    /**
12
     * @var array
13
     */
14
    private $defaults;
15
16
    /**
17
     * @param array $seoConfig
18
     * @return array
19
     */
20
    public function __invoke(array $seoConfig) : array
21
    {
22
        $this->defaults = $seoConfig['metas']['defaults'];
23
        unset($seoConfig['metas']['defaults']);
24
25
        $extendedMetaData = [];
26
        foreach ($seoConfig['metas']['pages'] as $routeName => $metaTags) {
27
            $extendedMetaData[$routeName] = $this->getExtendedData($metaTags);
28
        }
29
30
        $seoConfig['metas'] = [
31
            'defaults' => $this->defaults,
32
            'pages'    => $extendedMetaData,
33
        ];
34
        
35
        return $seoConfig;
36
    }
37
38
    /**
39
     * Allow to identify an attribute universally based on its type:
40
     * name, http-equiv, charset, property or itemprop
41
     * This is useful for overriding defaults meta values when processing a route config
42
     *
43
     * @param array $attributes
44
     */
45
    private function buildUniqueMetaKey(array $attributes) : string
46
    {
47
        $tagTypes = [ 'name', 'http-equiv', 'charset', 'itemprop', 'property' ];
48
        foreach ($tagTypes as $key) {
49
            if (true === isset($attributes[$key])) {
50
                // The "charset" meta has to be handled differently
51
                if ($key === 'charset') {
52
                    return 'charset';
53
                }
54
                return sprintf('%s:%s', $key, $attributes[$key]);
55
            }
56
        }
57
58
        return '';
59
    }
60
61
    /**
62
     * @param array $routeData
63
     * @return array
64
     */
65
    private function getExtendedData(array $routeData) : array
66
    {
67
        $data = [];
68
        // Fill basis meta data with defauls
69
        foreach ($this->defaults as $attributes) {
70
            // Determine which key to use for default value storing/overriding
71
            $uniqueKey = $this->buildUniqueMetaKey($attributes);
72
            $data[$uniqueKey] = $attributes;
73
        }
74
        // Override with route values
75
        foreach ($routeData as $attributes) {
76
            // Determine which key to use for default value storing/overriding
77
            $uniqueKey = $this->buildUniqueMetaKey($attributes);
78
            $data[$uniqueKey] = $attributes;
79
        }
80
        return $data;
81
    }
82
}
83