Completed
Push — master ( 3a08fe...aee93b )
by Tim
18:05 queued 16:13
created

CoreConfigDataLoader::load()   B

Complexity

Conditions 8
Paths 8

Size

Total Lines 76

Duplication

Lines 76
Ratio 100 %

Code Coverage

Tests 0
CRAP Score 72

Importance

Changes 0
Metric Value
dl 76
loc 76
ccs 0
cts 51
cp 0
rs 7.2791
c 0
b 0
f 0
cc 8
nc 8
nop 4
crap 72

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
/**
4
 * TechDivision\Import\Loaders\CoreConfigDataLoader
5
 *
6
 * NOTICE OF LICENSE
7
 *
8
 * This source file is subject to the Open Software License (OSL 3.0)
9
 * that is available through the world-wide-web at this URL:
10
 * http://opensource.org/licenses/osl-3.0.php
11
 *
12
 * PHP version 5
13
 *
14
 * @author    Tim Wagner <[email protected]>
15
 * @copyright 2020 TechDivision GmbH <[email protected]>
16
 * @license   http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
17
 * @link      https://github.com/techdivision/import
18
 * @link      http://www.techdivision.com
19
 */
20
21
namespace TechDivision\Import\Loaders;
22
23
use TechDivision\Import\Utils\ScopeKeys;
24
use TechDivision\Import\Utils\MemberNames;
25
use TechDivision\Import\Utils\Generators\GeneratorInterface;
26
use TechDivision\Import\Services\ConfigurationProcessorInterface;
27
28
/**
29
 * Generic loader implementation for the Magento core configuration data.
30
 *
31
 * @author    Tim Wagner <[email protected]>
32
 * @copyright 2020 TechDivision GmbH <[email protected]>
33
 * @license   http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
34
 * @link      https://github.com/techdivision/import
35
 * @link      http://www.techdivision.com
36
 */
37
class CoreConfigDataLoader implements LoaderInterface
38
{
39
40
    /**
41
     * The available websites.
42
     *
43
     * @var array
44
     */
45
    private $storeWebsites = array();
46
47
    /**
48
     * The core config data from the Magento instance.
49
     *
50
     * @var array
51
     */
52
    private $coreConfigData = array();
53
54
    /**
55
     * The UID generator for the core config data.
56
     *
57
     * @var \TechDivision\Import\Utils\Generators\GeneratorInterface
58
     */
59
    private $coreConfigDataUidGenerator;
60
61
    /**
62
     * Initialize the loader with the configuration processor and the UID generator for the core config data.
63
     *
64
     * @param \TechDivision\Import\Services\ConfigurationProcessorInterface $configurationProcessor     The registry processor instance
65
     * @param \TechDivision\Import\Utils\Generators\GeneratorInterface      $coreConfigDataUidGenerator The UID generator for the core config data
66
     */
67
    public function __construct(
68
        ConfigurationProcessorInterface $configurationProcessor,
69
        GeneratorInterface $coreConfigDataUidGenerator
70
    ) {
71
72
        // initialize the UUID generator
73
        $this->coreConfigDataUidGenerator = $coreConfigDataUidGenerator;
74
75
        // load the core configuration data from the Magento instance
76
        $this->coreConfigData = $configurationProcessor->getCoreConfigData();
77
78
        // load the store website data from the Magento instance
79
        $this->storeWebsites = $configurationProcessor->getStoreWebsites();
80
    }
81
82
    /**
83
     * Return's the Magento configuration value.
84
     *
85
     * @param string  $path    The Magento path of the requested configuration value
86
     * @param mixed   $default The default value that has to be returned, if the requested configuration value is not set
87
     * @param string  $scope   The scope the configuration value has been set
88
     * @param integer $scopeId The scope ID the configuration value has been set
89
     *
90
     * @return mixed The configuration value
91
     * @throws \Exception Is thrown, if nor a value can be found or a default value has been passed
92
     */
93 View Code Duplication
    public function load($path = null, $default = null, $scope = ScopeKeys::SCOPE_DEFAULT, $scopeId = 0)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
94
    {
95
96
        // initialize the core config data
97
        $coreConfigData = array(
98
            MemberNames::PATH => $path,
99
            MemberNames::SCOPE => $scope,
100
            MemberNames::SCOPE_ID => $scopeId
101
        );
102
103
        // generate the UID from the passed data
104
        $uniqueIdentifier = $this->coreConfigDataUidGenerator->generate($coreConfigData);
0 ignored issues
show
Unused Code introduced by
The call to GeneratorInterface::generate() has too many arguments starting with $coreConfigData.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
105
106
        // iterate over the core config data and try to find the requested configuration value
107
        if (isset($this->coreConfigData[$uniqueIdentifier])) {
108
            return $this->coreConfigData[$uniqueIdentifier][MemberNames::VALUE];
109
        }
110
111
        // query whether or not we've to query for the configuration value on fallback level 'websites' also
112
        if ($scope === ScopeKeys::SCOPE_STORES) {
113
            // query whether or not the website with the passed ID is available
114
            foreach ($this->storeWebsites as $storeWebsite) {
115
                if ($storeWebsite[MemberNames::WEBSITE_ID] === $scopeId) {
116
                    // replace scope with 'websites' and website ID
117
                    $coreConfigData = array_merge(
118
                        $coreConfigData,
119
                        array(
120
                            MemberNames::SCOPE    => ScopeKeys::SCOPE_WEBSITES,
121
                            MemberNames::SCOPE_ID => $storeWebsite[MemberNames::WEBSITE_ID]
122
                        )
123
                    );
124
125
                    // generate the UID from the passed data, merged with the 'websites' scope and ID
126
                    $uniqueIdentifier = $this->coreConfigDataUidGenerator->generate($coreConfigData);
0 ignored issues
show
Unused Code introduced by
The call to GeneratorInterface::generate() has too many arguments starting with $coreConfigData.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
127
128
                    // query whether or not, the configuration value on 'websites' level
129
                    if (isset($this->coreConfigData[$uniqueIdentifier][MemberNames::VALUE])) {
130
                        return $this->coreConfigData[$uniqueIdentifier][MemberNames::VALUE];
131
                    }
132
                }
133
            }
134
        }
135
136
        // replace scope with 'default' and scope ID '0'
137
        $coreConfigData = array_merge(
138
            $coreConfigData,
139
            array(
140
                MemberNames::SCOPE    => ScopeKeys::SCOPE_DEFAULT,
141
                MemberNames::SCOPE_ID => 0
142
            )
143
        );
144
145
        // generate the UID from the passed data, merged with the 'default' scope and ID 0
146
        $uniqueIdentifier = $this->coreConfigDataUidGenerator->generate($coreConfigData);
0 ignored issues
show
Unused Code introduced by
The call to GeneratorInterface::generate() has too many arguments starting with $coreConfigData.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
147
148
        // query whether or not, the configuration value on 'default' level
149
        if (isset($this->coreConfigData[$uniqueIdentifier][MemberNames::VALUE])) {
150
            return $this->coreConfigData[$uniqueIdentifier][MemberNames::VALUE];
151
        }
152
153
        // if not, return the passed default value
154
        if ($default !== null) {
155
            return $default;
156
        }
157
158
        // throw an exception if no value can be found
159
        // in the Magento configuration
160
        throw new \Exception(
161
            sprintf(
162
                'Can\'t find a value for configuration "%s-%s-%d" in "core_config_data"',
163
                $path,
164
                $scope,
165
                $scopeId
166
            )
167
        );
168
    }
169
}
170