Completed
Push — master ( 91e054...12ace7 )
by Kamil
31:08 queued 26:39
created

RequestConfigurationFactory::parseApiParameters()   B

Complexity

Conditions 5
Paths 9

Size

Total Lines 18
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 18
rs 8.8571
cc 5
eloc 9
nc 9
nop 1
1
<?php
2
3
/*
4
 * This file is part of the Sylius package.
5
 *
6
 * (c) Paweł Jędrzejewski
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace Sylius\Bundle\ResourceBundle\Controller;
13
14
use Sylius\Component\Resource\Metadata\MetadataInterface;
15
use Symfony\Component\HttpFoundation\Request;
16
17
/**
18
 * @author Paweł Jędrzejewski <[email protected]>
19
 */
20
class RequestConfigurationFactory implements RequestConfigurationFactoryInterface
21
{
22
    const API_VERSION_HEADER = 'Accept';
23
    const API_GROUPS_HEADER  = 'Accept';
24
25
    const API_VERSION_REGEXP = '/(v|version)=(?P<version>[0-9\.]+)/i';
26
    const API_GROUPS_REGEXP  = '/(g|groups)=(?P<groups>[a-z,_\s]+)/i';
27
28
    /**
29
     * @var ParametersParser
30
     */
31
    private $parametersParser;
32
33
    /**
34
     * @var string
35
     */
36
    private $configurationClass;
37
38
    /**
39
     * @var array
40
     */
41
    private $defaultParameters;
42
43
    /**
44
     * @param ParametersParser $parametersParser
45
     * @param string $configurationClass
46
     * @param array $defaultParameters
47
     */
48
    public function __construct(ParametersParser $parametersParser, $configurationClass, array $defaultParameters = array())
49
    {
50
        $this->parametersParser = $parametersParser;
51
        $this->configurationClass = $configurationClass;
52
        $this->defaultParameters = $defaultParameters;
53
    }
54
55
    /**
56
     * {@inheritdoc}
57
     */
58
    public function create(MetadataInterface $metadata, Request $request)
59
    {
60
        $parameters = $this->parseApiParameters($request);
61
        $parameters = $this->parametersParser->parseRequestValues($parameters, $request);
62
63
        return new $this->configurationClass($metadata, $request, new Parameters($parameters));
64
    }
65
66
    /**
67
     * @param Request $request
68
     *
69
     * @return array
70
     */
71
    private function parseApiParameters(Request $request)
72
    {
73
        $parameters = array();
74
75
        if ($request->headers->has(self::API_VERSION_HEADER)) {
76
            if (preg_match(self::API_VERSION_REGEXP, $request->headers->get(self::API_VERSION_HEADER), $matches)) {
77
                $parameters['serialization_version'] = $matches['version'];
78
            }
79
        }
80
81
        if ($request->headers->has(self::API_GROUPS_HEADER)) {
82
            if (preg_match(self::API_GROUPS_REGEXP, $request->headers->get(self::API_GROUPS_HEADER), $matches)) {
83
                $parameters['serialization_groups'] = array_map('trim', explode(',', $matches['groups']));
84
            }
85
        }
86
87
        return array_merge($request->attributes->get('_sylius', array()), $parameters);
88
    }
89
}
90