Passed
Push — master ( 630e5e...94c8c0 )
by Alain
03:20
created

ConfigTrait::fetchConfig()   A

Complexity

Conditions 3
Paths 2

Size

Total Lines 8
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 3

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 8
ccs 4
cts 4
cp 1
rs 9.4285
cc 3
eloc 4
nc 2
nop 1
crap 3
1
<?php
2
/**
3
 * Bright Nucleus Config Component.
4
 *
5
 * @package   BrightNucleus\Config
6
 * @author    Alain Schlesser <[email protected]>
7
 * @license   MIT
8
 * @link      http://www.brightnucleus.com/
9
 * @copyright 2016 Alain Schlesser, Bright Nucleus
10
 */
11
12
namespace BrightNucleus\Config;
13
14
use BrightNucleus\Config\Exception\FailedToProcessConfigException;
15
use Exception;
16
17
/**
18
 * Basic config processing that can be included within classes.
19
 *
20
 * @since   0.1.2
21
 *
22
 * @package BrightNucleus\Config
23
 * @author  Alain Schlesser <[email protected]>
24
 */
25
trait ConfigTrait
26
{
27
28
    /**
29
     * Reference to the Config object.
30
     *
31
     * @since 0.1.2
32
     *
33
     * @var ConfigInterface
34
     */
35
    protected $config;
36
37
    /**
38
     * Process the passed-in configuration file.
39
     *
40
     * @since 0.1.2
41
     *
42
     * @param ConfigInterface $config The Config to process.
43
     * @param                 string  ... List of keys.
44
     *
45
     * @throws FailedToProcessConfigException If the arguments could not be parsed into a Config.
46
     */
47 3
    protected function processConfig(ConfigInterface $config)
48
    {
49 3
        if (func_num_args() > 1) {
50
            try {
51 2
                $keys = func_get_args();
52 2
                array_shift($keys);
53 2
                $config = $config->getSubConfig($keys);
0 ignored issues
show
Documentation introduced by
$keys is of type array, but the function expects a string.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
54 1
            } catch (Exception $exception) {
55 1
                throw new FailedToProcessConfigException(
56
                    sprintf(
57 1
                        _('Could not process the config with the arguments "%1$s".'),
58 1
                        print_r(func_get_args(), true)
59
                    )
60
                );
61
            }
62
        }
63 2
        $this->config = $config;
64 2
    }
65
66
    /**
67
     * Check whether the Config has a specific key.
68
     *
69
     * To get a value several levels deep, add the keys for each level as a comma-separated list.
70
     *
71
     * @since 0.1.2
72
     * @since 0.1.5 Accepts list of keys.
73
     *
74
     * @param string|array $_ List of keys.
75
     *
76
     * @return bool Whether the key is known.
77
     */
78 2
    protected function hasConfigKey($_)
79
    {
80 2
        $keys = func_get_args();
81
82 2
        return $this->config->hasKey($keys);
83
    }
84
85
    /**
86
     * Get the Config value for a specific key.
87
     *
88
     * To get a value several levels deep, add the keys for each level as a comma-separated list.
89
     *
90
     * @since 0.1.2
91
     * @since 0.1.5 Accepts list of keys.
92
     *
93
     * @param string|array $_ List of keys.
94
     *
95
     * @return mixed Value of the key.
96
     */
97 2
    protected function getConfigKey($_)
98
    {
99 2
        $keys = func_get_args();
100
101 2
        return $this->config->getKey($keys);
102
    }
103
104
    /**
105
     * Get a (multi-dimensional) array of all the configuration settings.
106
     *
107
     * @since 0.1.4
108
     *
109
     * @return array All the configuration settings.
110
     */
111 1
    protected function getConfigArray()
112
    {
113 1
        return $this->config->getAll();
114
    }
115
116
    /**
117
     * Get an array of all the keys that are known by the Config.
118
     *
119
     * @since 0.1.2
120
     *
121
     * @return array Array of strings containing all the keys.
122
     */
123 1
    protected function getConfigKeys()
124
    {
125 1
        return $this->config->getKeys();
126
    }
127
128
    /**
129
     * Get a default configuration in case none was injected into the constructor.
130
     *
131
     * The name and path of the configuration needs to be set as a const called DEFAULT_CONFIG within the class
132
     * containing the trait. The path needs to be relative to the location of the containing class file.
133
     *
134
     * @since 0.4.2
135
     *
136
     * @return ConfigInterface Configuration settings to use.
0 ignored issues
show
Documentation introduced by
Should the return type not be Config|null?

This check compares the return type specified in the @return annotation of a function or method doc comment with the types returned by the function and raises an issue if they mismatch.

Loading history...
137
     */
138 1
    protected function fetchDefaultConfig()
139
    {
140 1
        $configFile = method_exists($this, 'getDefaultConfigFile')
141 1
            ? $this->getDefaultConfigFile()
0 ignored issues
show
Bug introduced by
It seems like getDefaultConfigFile() must be provided by classes using this trait. How about adding it as abstract method to this trait?

This check looks for methods that are used by a trait but not required by it.

To illustrate, let’s look at the following code example

trait Idable {
    public function equalIds(Idable $other) {
        return $this->getId() === $other->getId();
    }
}

The trait Idable provides a method equalsId that in turn relies on the method getId(). If this method does not exist on a class mixing in this trait, the method will fail.

Adding the getId() as an abstract method to the trait will make sure it is available.

Loading history...
142 1
            : __DIR__ . '/../config/defaults.php';
143
144 1
        return $this->fetchConfig($configFile);
145
    }
146
147
    /**
148
     * Get a configuration from a specified $file.
149
     *
150
     * If file is not accessible or readable, returns an empty Config.
151
     *
152
     * @since 0.4.2
153
     *
154
     * @return ConfigInterface Configuration settings to use.
0 ignored issues
show
Documentation introduced by
Should the return type not be Config|null?

This check compares the return type specified in the @return annotation of a function or method doc comment with the types returned by the function and raises an issue if they mismatch.

Loading history...
155
     */
156 2
    protected function fetchConfig($configFile)
157
    {
158 2
        if (is_string($configFile) && ! is_readable($configFile)) {
159 1
            $configFile = [];
160
        }
161
162 2
        return ConfigFactory::create($configFile);
163
    }
164
}
165