Вход Регистрация
Файл: forsoc.ru/vendor/lusitanian/oauth/src/OAuth/ServiceFactory.php
Строк: 205
<?php

/**
 * OAuth service factory.
 *
 * PHP version 5.4
 *
 * @category   OAuth
 * @author     David Desberg <david@daviddesberg.com>
 * @author     Pieter Hordijk <info@pieterhordijk.com>
 * @copyright  Copyright (c) 2013 The authors
 * @license    http://www.opensource.org/licenses/mit-license.html  MIT License
 */

namespace OAuth;

use 
OAuthCommonServiceServiceInterface;
use 
OAuthCommonConsumerCredentialsInterface;
use 
OAuthCommonStorageTokenStorageInterface;
use 
OAuthCommonHttpClientClientInterface;
use 
OAuthCommonHttpClientStreamClient;
use 
OAuthCommonHttpUriUriInterface;
use 
OAuthCommonExceptionException;
use 
OAuthOAuth1SignatureSignature;

class 
ServiceFactory
{
    
/**
     *@var ClientInterface
     */
    
protected $httpClient;

    
/**
     * @var array
     */
    
protected $serviceClassMap = array(
        
'OAuth1' => array(),
        
'OAuth2' => array()
    );

    
/**
     * @var array
     */
    
protected $serviceBuilders = array(
        
'OAuth2' => 'buildV2Service',
        
'OAuth1' => 'buildV1Service',
    );

    
/**
     * @param ClientInterface $httpClient
     *
     * @return ServiceFactory
     */
    
public function setHttpClient(ClientInterface $httpClient)
    {
        
$this->httpClient $httpClient;

        return 
$this;
    }

    
/**
     * Register a custom service to classname mapping.
     *
     * @param string $serviceName Name of the service
     * @param string $className   Class to instantiate
     *
     * @return ServiceFactory
     *
     * @throws Exception If the class is nonexistent or does not implement a valid ServiceInterface
     */
    
public function registerService($serviceName$className)
    {
        if (!
class_exists($className)) {
            throw new 
Exception(sprintf('Service class %s does not exist.'$className));
        }

        
$reflClass = new ReflectionClass($className);

        foreach (array(
'OAuth2''OAuth1') as $version) {
            if (
$reflClass->implementsInterface('OAuth\' . $version . '\Service\ServiceInterface')) {
                $this->serviceClassMap[$version][ucfirst($serviceName)] = $className;

                return $this;
            }
        }

        throw new Exception(sprintf('
Service class %s must implement ServiceInterface.', $className));
    }

    /**
     * Builds and returns oauth services
     *
     * It will first try to build an OAuth2 service and if none found it will try to build an OAuth1 service
     *
     * @param string                $serviceName Name of service to create
     * @param Credentials           $credentials
     * @param TokenStorageInterface $storage
     * @param array|null            $scopes      If creating an oauth2 service, array of scopes
     * @param UriInterface|null     $baseApiUri
     *
     * @return ServiceInterface
     *
     * @throws Exception
     */
    public function createService(
        $serviceName,
        CredentialsInterface $credentials,
        TokenStorageInterface $storage,
        $scopes = array(),
        UriInterface $baseApiUri = null
    ) {
        if (!$this->httpClient) {
            // for backwards compatibility.
            $this->httpClient = new StreamClient();
        }

        foreach ($this->serviceBuilders as $version => $buildMethod) {
            $fullyQualifiedServiceName = $this->getFullyQualifiedServiceName($serviceName, $version);

            if (class_exists($fullyQualifiedServiceName)) {
                return $this->$buildMethod($fullyQualifiedServiceName, $credentials, $storage, $scopes, $baseApiUri);
            }
        }

        return null;
    }

    /**
     * Gets the fully qualified name of the service
     *
     * @param string $serviceName The name of the service of which to get the fully qualified name
     * @param string $type        The type of the service to get (either OAuth1 or OAuth2)
     *
     * @return string The fully qualified name of the service
     */
    private function getFullyQualifiedServiceName($serviceName, $type)
    {
        $serviceName = ucfirst($serviceName);

        if (isset($this->serviceClassMap[$type][$serviceName])) {
            return $this->serviceClassMap[$type][$serviceName];
        }

        return '
\OAuth\' . $type . '\Service\' . $serviceName;
    }

    /**
     * Builds v2 services
     *
     * @param string                $serviceName The fully qualified service name
     * @param CredentialsInterface  $credentials
     * @param TokenStorageInterface $storage
     * @param array|null            $scopes      Array of scopes for the service
     * @param UriInterface|null     $baseApiUri
     *
     * @return ServiceInterface
     *
     * @throws Exception
     */
    private function buildV2Service(
        $serviceName,
        CredentialsInterface $credentials,
        TokenStorageInterface $storage,
        array $scopes,
        UriInterface $baseApiUri = null
    ) {
        return new $serviceName(
            $credentials,
            $this->httpClient,
            $storage,
            $this->resolveScopes($serviceName, $scopes),
            $baseApiUri
        );
    }

    /**
     * Resolves scopes for v2 services
     *
     * @param $string $serviceName The fully qualified service name
     * @param array   $scopes      List of scopes for the service
     *
     * @return array List of resolved scopes
     */
    private function resolveScopes($serviceName, array $scopes)
    {
        $reflClass = new ReflectionClass($serviceName);
        $constants = $reflClass->getConstants();

        $resolvedScopes = array();
        foreach ($scopes as $scope) {
            $key = strtoupper('
SCOPE_' . $scope);

            if (array_key_exists($key, $constants)) {
                $resolvedScopes[] = $constants[$key];
            } else {
                $resolvedScopes[] = $scope;
            }
        }

        return $resolvedScopes;
    }

    /**
     * Builds v1 services
     *
     * @param string                $serviceName The fully qualified service name
     * @param CredentialsInterface  $credentials
     * @param TokenStorageInterface $storage
     *
     * @return ServiceInterface
     *
     * @throws Exception
     */
    private function buildV1Service(
        $serviceName,
        CredentialsInterface $credentials,
        TokenStorageInterface $storage,
        $scopes,
        UriInterface $baseApiUri = null
    ) {
        if (!empty($scopes)) {
            throw new Exception(
                '
Scopes passed to ServiceFactory::createService but an OAuth1 service was requested.'
            );
        }

        return new $serviceName($credentials, $this->httpClient, $storage, new Signature($credentials), $baseApiUri);
    }
}
Онлайн: 0
Реклама