isometriks/google-api-bundle

Symfony2 扩展包,用于使用 Google API

v0.1 2016-06-21 15:13 UTC

This package is auto-updated.

Last update: 2024-09-24 09:20:05 UTC


README

安装

$ php composer.phar require isometriks/google-api-bundle dev-master

添加路由

isometriks_google_api:
    resource: "@IsometriksGoogleApiBundle/Resources/config/routing.yml"
    prefix: /google

注意:以下 redirect_uri 和开发控制台中的 isometriks_google_redirect 路由应匹配。因此,如果按照上面做,那么开发环境中下面的 redirect_uri 应该是: http://example.com/app_dev.php/google/redirect,而生产环境中则无需 app_dev.php。 redirect_route 将生成 redirect_uri

配置

isometriks_google_api:
    client:
        application_name:       ~
        client_id:              ~
        client_secret:          ~
        redirect_route:         ~
        developer_key:          ~
        include_granted_scopes: false
        access_type:            online # or offline
    service:
        storage:                isometriks_google_api.storage.session

控制器注释

<?php

namespace AppBundle\Controller;

use Isometriks\Bundle\GoogleApiBundle\Annotation\GoogleScope;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;

/**
 * @GoogleScope({"gmail.readonly"})
 */
class MyController extends Controller
{
    /**
     * @GoogleScope({"analytics.readonly", "calendar.readonly"})
     */
    public function indexAction()
    {
        // Will only execute if we have all 3 permissions

        // Use the services available in the Google PHP API
        $client = $this->get('isometriks_google_api.client');
        $analytics = new \Google_Service_Analytics($client);

        var_dump($analytics->management_accounts->listManagementAccounts()); // etc
    }
}

无注释

<?php

namespace AppBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class MyController extends Controller
{
    /**
     * @Route("/", name="homepage")
     */
    public function indexAction()
    {
        $scopeManager = $this->get('isometriks_google_api.scope_manager');

        if (!$scopeManager->hasScope('calendar.readonly')) {
            return $this->redirect($scopeManager->obtainScopeUrl(
                array('calendar.readonly'),
                $this->generateUrl('homepage')
            ));
        }

        // obtainScopeUrl(array $scopes, $returnUrl)
    }
}

令牌存储

默认情况下,系统将使用会话来存储令牌。如果您打算使用刷新令牌(type = offline),则这不会很好,因为销毁会话将销毁您的刷新令牌,因为您只能在第一次授权时获得一个。在这种情况下,您可以创建自己的存储,或者如果您需要为用户提供存储令牌,我们提供了一个抽象类来帮助您。

用户存储示例

<?php

namespace AppBundle\Storage;

use Isometriks\Bundle\GoogleApiBundle\Storage\UserStorage as BaseUserStorage;

class UserStorage extends BaseUserStorage
{
    public function getToken()
    {
        return $this->getUser()->getToken();
    }

    public function hasToken()
    {
        return $this->getUser() && $this->getUser()->getToken();
    }

    public function removeToken()
    {
        $this->getUser()->setToken(null);

        // Persist Doctrine / Propel etc..
    }

    public function setToken($token)
    {
        $this->getUser()->setToken($token);

        // Persist Doctrine / Propel etc..
    }
}

并且请记住更改配置

isometriks_google_api:
    service:
        storage: app_bundle.storage.user_storage

您可以扩展我们提供的抽象服务: isometriks_google_api.storage.user_storage 如上所述的类中所述,您需要添加setter注入或添加一个构造函数参数,以确保用户在您的ORM/其他实现中被持久化。

显示“连接”屏幕

您可以通过事件轻松地绑定到事件,在将用户发送到 Google 以获取令牌之前显示“连接”按钮视图,使用 Events::OAUTH_PRE_AUTH 事件。

<?php

// ...

class PreAuthListener implements EventSubscriberInterface
{
    protected $twig;

    public function __construct(\Twig_Environment $twig)
    {
        $this->twig = $twig;
    }

    public function onPreAuth(ClientEvent $event)
    {
        // Or use your own template, ours is mostly just an example
        $content = $this->twig->render('IsometriksGoogleApiBundle:OAuth:connect.html.twig', array(
            'auth_url' => $event->getClient()->createAuthUrl(),
        ));

        $event->setResponse(new Response($content));
    }

    public static function getSubscribedEvents()
    {
        return array(
            Events::OAUTH_PRE_AUTH => 'onPreAuth',
        );
    }
}