Completed
Push — master ( a4d333...78d48a )
by Дмитрий
03:58 queued 01:21
created

CollectionFactory::__construct()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 6
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 2.2559

Importance

Changes 0
Metric Value
dl 0
loc 6
ccs 3
cts 5
cp 0.6
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 3
nc 2
nop 1
crap 2.2559
1
<?php
2
/**
3
 * SocialConnect project
4
 * @author: Patsura Dmitry https://github.com/ovr <[email protected]>
5
 */
6
7
namespace SocialConnect\Auth;
8
9
use LogicException;
10
use SocialConnect\Provider\AbstractBaseProvider;
11
use SocialConnect\Provider\Consumer;
12
use SocialConnect\OAuth1;
13
use SocialConnect\OAuth2;
14
use SocialConnect\OpenID;
15
16
/**
17
 * Class Factory
18
 * @package SocialConnect\Auth\Provider
19
 */
20
class CollectionFactory implements FactoryInterface
21
{
22
    /**
23
     * @var array
24
     */
25
    protected $providers = [
26
        // OAuth1
27
        'twitter'       => OAuth1\Provider\Twitter::class,
28
        'px500'         => OAuth1\Provider\Px500::class,
29
        'tumblr'        => OAuth1\Provider\Tumblr::class,
30
        // OAuth2
31
        'facebook'      => OAuth2\Provider\Facebook::class,
32
        'github'        => OAuth2\Provider\GitHub::class,
33
        'instagram'     => OAuth2\Provider\Instagram::class,
34
        'google'        => OAuth2\Provider\Google::class,
35
        'vk'            => OAuth2\Provider\Vk::class,
36
        'slack'         => OAuth2\Provider\Slack::class,
37
        'twitch'        => OAuth2\Provider\Twitch::class,
38
        'bitbucket'     => OAuth2\Provider\Bitbucket::class,
39
        'amazon'        => OAuth2\Provider\Amazon::class,
40
        'gitlab'        => OAuth2\Provider\GitLab::class,
41
        'vimeo'         => OAuth2\Provider\Vimeo::class,
42
        'digital-ocean' => OAuth2\Provider\DigitalOcean::class,
43
        'yandex'        => OAuth2\Provider\Yandex::class,
44
        'mail-ru'       => OAuth2\Provider\MailRu::class,
45
        'odnoklassniki' => OAuth2\Provider\Odnoklassniki::class,
46
        // OpenID
47
        'steam'         => OpenID\Provider\Steam::class,
48
    ];
49
50
    /**
51
     * @param array $providers
52
     */
53 3
    public function __construct(array $providers = null)
54
    {
55 3
        if ($providers) {
56
            $this->providers = $providers;
57
        }
58 3
    }
59
60
    /**
61
     * @param $id
62
     * @return bool
63
     */
64
    public function has($id)
65
    {
66
        return isset($this->providers[$id]);
67
    }
68
69
    /**
70
     * @param string $id
71
     * @param array $parameters
72
     * @param Service $service
73
     * @return \SocialConnect\Provider\AbstractBaseProvider
74
     */
75 2
    public function factory($id, array $parameters, Service $service)
76
    {
77 2
        $consumer = new Consumer($parameters['applicationId'], $parameters['applicationSecret']);
78
79 2
        if (isset($parameters['applicationPublic'])) {
80
            $consumer->setPublic($parameters['applicationPublic']);
81
        }
82
83 2
        $id = strtolower($id);
84
85 2
        if (!isset($this->providers[$id])) {
86
            throw new LogicException('Provider with $id = ' . $id . ' doest not exist');
87
        }
88
89 2
        $providerClassName = $this->providers[$id];
90
91
        /**
92
         * @var $provider \SocialConnect\Provider\AbstractBaseProvider
93
         */
94 2
        $provider = new $providerClassName(
95 2
            $service->getHttpClient(),
96 2
            $service->getSession(),
97 2
            $consumer,
98 2
            array_merge(
99 2
                $parameters,
100 2
                $service->getConfig()
101 2
            )
102 2
        );
103
104 2
        return $provider;
105
    }
106
107
    /**
108
     * Register new provider to Provider's collection
109
     *
110
     * @param AbstractBaseProvider $provider
111
     */
112
    public function register(AbstractBaseProvider $provider)
113
    {
114
        $this->providers[$provider->getName()] = get_class($provider);
115
    }
116
}
117