Passed
Push — master ( 9a8256...ab52bb )
by Anton
02:11
created

src/JsonApiParser.php (1 issue)

Checks valid variable name private no underscore

Coding Style Informational

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
/**
3
 * @author Anton Tuyakhov <[email protected]>
4
 */
5
6
namespace tuyakhov\jsonapi;
7
8
use yii\base\InvalidConfigException;
9
use yii\helpers\ArrayHelper;
10
use yii\helpers\Inflector;
11
use \yii\web\JsonParser;
12
13
class JsonApiParser extends JsonParser
14
{
15
    /**
16
     * @var array|callable|null
17
     */
18
    protected $formNameCallback;
0 ignored issues
show
Protected member variable "formNameCallback" must contain a leading underscore
Loading history...
19
20
    public function __construct($formNameCallback = null)
21
    {
22
        if ($formNameCallback === null) {
23
            $formNameCallback = [$this, 'typeToFormName'];
24
        }
25
        if (!is_callable($formNameCallback, true)) {
26
            throw new InvalidConfigException('JsonApiParser::formNameCallback should be callable');
27
        }
28
29
        $this->formNameCallback = $formNameCallback;
30
    }
31
32
33
    /**
34
     * Parse resource object into the input data to populates the model
35
     * @inheritdoc
36
     */
37
    public function parse($rawBody, $contentType)
38
    {
39
        $array = parent::parse($rawBody, $contentType);
40
        if ($type = ArrayHelper::getValue($array, 'data.type')) {
41
            $formName = call_user_func($this->formNameCallback, $type);
42
            if ($attributes = ArrayHelper::getValue($array, 'data.attributes')) {
43
                $result[$formName] = $attributes;
44
            } elseif ($id = ArrayHelper::getValue($array, 'data.id')) {
45
                $result[$formName] = ['id' => $id, 'type' => $type];
46
            }
47
            if ($relationships = ArrayHelper::getValue($array, 'data.relationships')) {
48
                foreach ($relationships as $name => $relationship) {
49
                    if (isset($relationship[0])) {
50 View Code Duplication
                        foreach ($relationship as $item) {
51
                            if (isset($item['type']) && isset($item['id'])) {
52
                                $formName = call_user_func($this->formNameCallback, $item['type']);
53
                                $result[$name][$formName][] = $item;
54
                            }
55
                        }
56
                    } elseif (isset($relationship['type']) && isset($relationship['id'])) {
57
                        $formName = call_user_func($this->formNameCallback, $relationship['type']);
58
                        $result[$name][$formName] = $relationship;
59
                    }
60
                }
61
            }
62
        } else {
63
            $data = ArrayHelper::getValue($array, 'data', []);
64 View Code Duplication
            foreach ($data as $relationLink) {
65
                if (isset($relationLink['type']) && isset($relationLink['id'])) {
66
                    $formName = call_user_func($this->formNameCallback, $relationLink['type']);
67
                    $result[$formName][] = $relationLink;
68
                }
69
            }
70
        }
71
        return isset($result) ? $result : $array;
72
    }
73
74
    protected function typeToFormName($type)
75
    {
76
        return Inflector::id2camel(Inflector::singularize($type));
77
    }
78
}
79