isometriks / google-api-bundle
Symfony2 扩展包,用于使用 Google API
v0.1
2016-06-21 15:13 UTC
Requires
- google/apiclient: ~1.1.0
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',
);
}
}