Passed
Push — develop ( 523929...adbb71 )
by Jens
11:30
created

Context::setCurrencyFormatter()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 5
ccs 3
cts 3
cp 1
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 3
nc 1
nop 1
crap 1
1
<?php
2
/**
3
 * @author @jenschude <[email protected]>
4
 */
5
6
namespace Commercetools\Core\Model\Common;
7
8
use Pimple\Container;
9
use Psr\Log\LoggerInterface;
10
use Commercetools\Core\Helper\CurrencyFormatter;
11
12
/**
13
 * @description
14
 * ## Usage
15
 *
16
 * The context will be set at ContextAware objects like JsonObject and Collection. By adding a context to the client
17
 * config the context will be set to all request, responses and other ContextAware objects. Besides that you can always
18
 * set a new context to every ContextAware object at any time.
19
 *
20
 * ```php
21
 * $context = Context::of();
22
 * ```
23
 *
24
 * For production environments it's advised to set the graceful flag to prevent Exceptions by toString conversions()
25
 *
26
 * ```php
27
 * $context->setGraceful(true);
28
 * ```
29
30
 * ### Languages and Locales
31
 *
32
 * For automatic fallback string conversion e.g. with LocalizedString you can set the available languages. The
33
 * LocalizedString will try to resolve a string in the given order. It's strongly advised to set the locale in
34
 * the Context as it is used for example by the CurrencyFormatter. If no locale is set, the default locale given
35
 * by php config will be used.
36
 *
37
 * ```php
38
 * $context->setLanguages(['de', 'en'])->setLocale('de_DE');
39
 * ```
40
 *
41
 * ### CurrencyFormatter
42
 *
43
 * The context provides a builtin CurrencyFormatter. The default currency formatter will format a currency with
44
 * the help of the intl extension and the locale set.
45
 *
46
 * Example for custom currency formatter:
47
 * ```php
48
 * $currencyFormatter = new CurrencyFormatter();
49
 * $currencyFormatter->setFormatCallback(function($centAmount, $currency)) {
50
 *     $amount = $centAmount / 100;
51
 *     $currency = mb_strtoupper($currency);
52
 *     $locale = $this->context->getLocale();
53
 *
54
 *     $formatter = new \NumberFormatter($locale, \NumberFormatter::CURRENCY);
55
 *     return $formatter->formatCurrency($amount, $currency);
56
 * }
57
 * $context->setCurrencyFormatter($currencyFormatter);
58
 * ```
59
 *
60
 * @package Commercetools\Core\Model\Common
61
 */
62
class Context implements \ArrayAccess
63
{
64
    /**
65
     * @var bool
66
     */
67
    private $graceful = false;
68
69
    /**
70
     * @var array
71
     */
72
    private $languages = [];
73
74
    /**
75
     * @var CurrencyFormatter
76
     */
77
    private $currencyFormatter;
78
79
    /**
80
     * @var string
81
     */
82
    private $locale;
83
84
    /**
85
     * @var LoggerInterface
86
     */
87
    private $logger;
88
89
    const GRACEFUL = 'graceful';
90
    const LANGUAGES = 'languages';
91
    const CURRENCY_FORMATTER = 'currencyFormatter';
92
    const LOCALE = 'locale';
93
    const LOGGER = 'logger';
94
95 258
    public function __construct()
96
    {
97
98 258
        $context = $this;
99 258
        $this->currencyFormatter = new CurrencyFormatter($context);
100 258
        $this->locale = null;
101 258
        if (extension_loaded('intl')) {
102 253
            $this->locale = \Locale::getDefault();
103
        }
104 258
        $this->logger = null;
105 258
    }
106
107
    /**
108
     * @return boolean
109
     */
110 84
    public function isGraceful()
111
    {
112 84
        return $this->graceful;
113
    }
114
115
    /**
116
     * @param boolean $graceful
117
     * @return Context
118
     */
119 149
    public function setGraceful($graceful)
120
    {
121 149
        $this->graceful = $graceful;
122 149
        return $this;
123
    }
124
125
    /**
126
     * @return array
127
     */
128 125
    public function getLanguages()
129
    {
130 125
        return $this->languages;
131
    }
132
133
    /**
134
     * @param array $languages
135
     * @return Context
136
     */
137 166
    public function setLanguages(array $languages)
138
    {
139 166
        $this->languages = $languages;
140 166
        return $this;
141
    }
142
143
    /**
144
     * @return CurrencyFormatter
145
     */
146 5
    public function getCurrencyFormatter()
147
    {
148 5
        return $this->currencyFormatter;
149
    }
150
151
    /**
152
     * @param CurrencyFormatter $currencyFormatter
153
     * @return Context
154
     */
155 1
    public function setCurrencyFormatter($currencyFormatter)
156
    {
157 1
        $this->currencyFormatter = $currencyFormatter;
158 1
        return $this;
159
    }
160
161
    /**
162
     * @return string
163
     */
164 7
    public function getLocale()
165
    {
166 7
        return $this->locale;
167
    }
168
169
    /**
170
     * @param string $locale
171
     * @return Context
172
     */
173 46
    public function setLocale($locale)
174
    {
175 46
        $this->locale = $locale;
176 46
        return $this;
177
    }
178
179
    /**
180
     * @return LoggerInterface
181
     */
182 6
    public function getLogger()
183
    {
184 6
        return $this->logger;
185
    }
186
187
    /**
188
     * @param LoggerInterface $logger
189
     * @return Context
190
     */
191 2
    public function setLogger($logger)
192
    {
193 2
        $this->logger = $logger;
194 2
        return $this;
195
    }
196
197 95
    public static function of()
198
    {
199 95
        return new static();
200
    }
201
202
    /**
203
     * @inheritDoc
204
     */
205 1
    public function offsetExists($offset)
206
    {
207 1
        return isset($this->$offset);
208
    }
209
210
    /**
211
     * @inheritDoc
212
     */
213 1 View Code Duplication
    public function offsetGet($offset)
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...
214
    {
215 1
        if ($this->offsetExists($offset)) {
216 1
            $method = 'get'.ucfirst($offset);
217
218 1
            return $this->$method();
219
        }
220
        return null;
221
    }
222
223
    /**
224
     * @inheritDoc
225
     */
226 1
    public function offsetSet($offset, $value)
227
    {
228 1
        if (property_exists($this, $offset)) {
229 1
            $method = 'set'.ucfirst($offset);
230
231 1
            $this->$method($value);
232
        }
233 1
    }
234
235
    /**
236
     * @inheritDoc
237
     */
238 View Code Duplication
    public function offsetUnset($offset)
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...
239
    {
240
        if ($this->offsetExists($offset)) {
241
            $method = 'set'.ucfirst($offset);
242
243
            $this->$method(null);
244
        }
245
    }
246
}
247