LazyExtractor::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 13
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 5
Bugs 3 Features 2
Metric Value
c 5
b 3
f 2
dl 0
loc 13
rs 9.4285
cc 1
eloc 9
nc 1
nop 4
1
<?php
2
3
/*
4
 * This file is part of the Oryzone PHPoAuthUserData package <https://github.com/Oryzone/PHPoAuthUserData>.
5
 *
6
 * (c) Oryzone, developed by Luciano Mammino <[email protected]>
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 OAuth\UserData\Extractor;
13
14
/**
15
 * Class LazyExtractor
16
 * @package OAuth\UserData\Extractor
17
 */
18
class LazyExtractor extends Extractor
19
{
20
    /**
21
     * @var array $loadersMap
22
     */
23
    protected $loadersMap;
24
25
    /**
26
     * @var array $normalizersMap
27
     */
28
    protected $normalizersMap;
29
30
    /**
31
     * @var array $loadersResults
32
     */
33
    protected $loadersResults;
34
35
    /**
36
     * Constructor
37
     *
38
     * @param array    $loadersMap
39
     * @param array    $normalizersMap
40
     * @param string[] $supports
41
     * @param array    $fields
42
     */
43
    public function __construct(
44
        $loadersMap = array(),
45
        $normalizersMap = array(),
46
        $supports = array(),
47
        $fields = array()
48
    ) {
49
        parent::__construct($supports, $fields);
50
51
        $this->loadersMap = $loadersMap;
52
        $this->normalizersMap = $normalizersMap;
53
54
        $this->loadersResults = array();
55
    }
56
57
    /**
58
     * {@inheritDoc}
59
     * @param string $field
60
     */
61
    public function getField($field)
62
    {
63
        if (!$this->isFieldSupported($field)) {
64
            return null;
65
        }
66
67
        if (!$this->hasLoadedField($field)) {
68
            $loaderData = $this->getLoaderData($field);
69
            if (isset($this->normalizersMap[$field])) {
70
                $normalizerName = $this->normalizersMap[$field];
71
                $normalizerFunction = sprintf('%sNormalizer', $normalizerName);
72
                $this->fields[$field] = $this->$normalizerFunction($loaderData);
73
            } else {
74
                $this->fields[$field] = $loaderData;
75
            }
76
        }
77
78
        return parent::getField($field);
79
    }
80
81
    /**
82
     * Check if already loaded a given field
83
     *
84
     * @param  string $field
85
     * @return bool
86
     */
87
    protected function hasLoadedField($field)
88
    {
89
        return array_key_exists($field, $this->fields);
90
    }
91
92
    /**
93
     * Get data from a loader.
94
     * A loader is a function who is delegated to fetch a request to get the raw data
95
     *
96
     * @param  string $field
97
     * @return mixed
98
     */
99
    protected function getLoaderData($field)
100
    {
101
        $loaderName = $this->loadersMap[$field];
102
        $loaderFunction = sprintf('%sLoader', $loaderName);
103
        if (!isset($this->loadersResults[$loaderName])) {
104
            $this->loadersResults[$loaderName] = $this->$loaderFunction();
105
        }
106
107
        return $this->loadersResults[$loaderName];
108
    }
109
110
    /**
111
     * Get a default map of loaders
112
     *
113
     * @return array
114
     */
115
    protected static function getDefaultLoadersMap()
116
    {
117
        return array(
118
            self::FIELD_UNIQUE_ID       =>   'profile',
119
            self::FIELD_USERNAME        =>   'profile',
120
            self::FIELD_FIRST_NAME      =>   'profile',
121
            self::FIELD_LAST_NAME       =>   'profile',
122
            self::FIELD_FULL_NAME       =>   'profile',
123
            self::FIELD_EMAIL           =>   'profile',
124
            self::FIELD_DESCRIPTION     =>   'profile',
125
            self::FIELD_LOCATION        =>   'profile',
126
            self::FIELD_PROFILE_URL     =>   'profile',
127
            self::FIELD_IMAGE_URL       =>   'profile',
128
            self::FIELD_WEBSITES        =>   'profile',
129
            self::FIELD_VERIFIED_EMAIL  =>   'profile',
130
            self::FIELD_EXTRA           =>   'profile',
131
        );
132
    }
133
134
    /**
135
     * Get a default normalizers map
136
     *
137
     * @return array
138
     */
139
    protected static function getDefaultNormalizersMap()
140
    {
141
        return array(
142
            self::FIELD_UNIQUE_ID       =>   self::FIELD_UNIQUE_ID,
143
            self::FIELD_USERNAME        =>   self::FIELD_USERNAME,
144
            self::FIELD_FIRST_NAME      =>   self::FIELD_FIRST_NAME,
145
            self::FIELD_LAST_NAME       =>   self::FIELD_LAST_NAME,
146
            self::FIELD_FULL_NAME       =>   self::FIELD_FULL_NAME,
147
            self::FIELD_EMAIL           =>   self::FIELD_EMAIL,
148
            self::FIELD_DESCRIPTION     =>   self::FIELD_DESCRIPTION,
149
            self::FIELD_LOCATION        =>   self::FIELD_LOCATION,
150
            self::FIELD_PROFILE_URL     =>   self::FIELD_PROFILE_URL,
151
            self::FIELD_IMAGE_URL       =>   self::FIELD_IMAGE_URL,
152
            self::FIELD_WEBSITES        =>   self::FIELD_WEBSITES,
153
            self::FIELD_VERIFIED_EMAIL  =>   self::FIELD_VERIFIED_EMAIL,
154
            self::FIELD_EXTRA           =>   self::FIELD_EXTRA,
155
        );
156
    }
157
}
158