Completed
Push — master ( 512ee3...1ba870 )
by Oscar
03:27
created

LanguageNegotiator::getFromHeader()   A

Complexity

Conditions 4
Paths 3

Size

Total Lines 14
Code Lines 7

Duplication

Lines 14
Ratio 100 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 14
loc 14
rs 9.2
cc 4
eloc 7
nc 3
nop 1
1
<?php
2
3
namespace Psr7Middlewares\Middleware;
4
5
use Psr7Middlewares\Middleware;
6
use Psr7Middlewares\Utils;
7
use Negotiation\LanguageNegotiator as Negotiator;
8
use Psr\Http\Message\ServerRequestInterface;
9
use Psr\Http\Message\ResponseInterface;
10
11
/**
12
 * Middleware returns the client preferred language.
13
 */
14
class LanguageNegotiator
15
{
16
    use Utils\NegotiateTrait;
17
18
    const KEY = 'LANGUAGE';
19
20
    /**
21
     * @var array Allowed languages
22
     */
23
    private $languages = [];
24
25
    /**
26
     * Returns the language.
27
     *
28
     * @param ServerRequestInterface $request
29
     *
30
     * @return string|null
31
     */
32
    public static function getLanguage(ServerRequestInterface $request)
33
    {
34
        return Middleware::getAttribute($request, self::KEY);
35
    }
36
37
    /**
38
     * Constructor. Defines de available languages.
39
     *
40
     * @param array $languages
41
     */
42
    public function __construct(array $languages = null)
43
    {
44
        if ($languages !== null) {
45
            $this->languages($languages);
46
        }
47
    }
48
49
    /**
50
     * Configure the available languages.
51
     *
52
     * @param array $languages
53
     *
54
     * @return self
55
     */
56
    public function languages(array $languages)
57
    {
58
        $this->languages = $languages;
59
60
        return $this;
61
    }
62
63
    /**
64
     * Execute the middleware.
65
     *
66
     * @param ServerRequestInterface $request
67
     * @param ResponseInterface      $response
68
     * @param callable               $next
69
     *
70
     * @return ResponseInterface
71
     */
72
    public function __invoke(ServerRequestInterface $request, ResponseInterface $response, callable $next)
73
    {
74
        $language = $this->negotiateHeader($request->getHeaderLine('Accept-Language'), new Negotiator(), $this->languages);
75
76
        if (empty($language)) {
77
            $language = isset($this->languages[0]) ? $this->languages[0] : null;
78
        }
79
80
        $request = Middleware::setAttribute($request, self::KEY, $language);
81
82
        return $next($request, $response);
83
    }
84
}
85