Pull to refresh

Интеграция Symfony 2 и Google Calendar

Reading time 3 min
Views 10K
При создании современного веб проекта вам не обойтись без работы с внешними сервисами. Недавно у нас возникла задача по работе с календарями. В этой статье я бы хотел рассказать о некоторых моментах интеграции проекта на Symfony2 с Google Calendar.

Получение ключа


Для обмена данными с google нужно получить ключ. Наш сайт будет обращаться за информацией незаметно для пользователя, поэтому нам нужен ключ для сервис аккаунта. Для получения ключа нужно отправиться в консоль для разработчиков. Добавить приложение, зайти во вкладку Api и активировать календарь. Теперь вы сможете получить ключ на вкладке Credentials.
Есть вариант json или p12. Особой разницы нету, зависит от того, что вам удобнее.

Модуль Google Api


Для работы с сервисами google есть api клиент. Установим его через composer
php composer.phar require google/apiclient

Сделаем небольшую обертку и объявить ее как сервис.
class Google
{
    /* @var \Google_Client */
    private $client;

    /* @var \Google_Service_Calendar */
    private $calendar;

    private $scope;

    public function __construct($scope)
    {
        $this->client = new \Google_Client();
        $this->scope = $scope;
    }

    public function setCredentialsP12($p12Path, $email)
    {
        $credentials = new \Google_Auth_AssertionCredentials(
            $email,
            $this->scope,
            file_get_contents($p12Path)
        );

        $this->client->setAssertionCredentials($credentials);
    }

    public function setCredentialsJson($jsonPath)
    {
        $this->client->loadServiceAccountJson($jsonPath, $this->scope);
    }

    /**
     * @return \Google_Service_Calendar
     */
    public function getCalendar()
    {
        if (!$this->calendar) {
            $this->calendar = new \Google_Service_Calendar($this->client);
        }

        return $this->calendar;
    }
}


services:
    google.client:
        class: MyBundle\Google
        arguments: ['https://www.googleapis.com/auth/calendar.readonly'] # Сейчас нам нужны только права на чтение календаря

Методы setCredentialsP12 и setCredentialsJson нужны для того чтобы передавать ключи внутрь нашего сервиса. Метод getCalendar возвращает подготовленный объект календаря и нам не нужно как-то его дополнять вне нашего сервиса.

Подключение ключа


У нас могут быть разные ключи в разных окружениях, а также у каждого разработчика может быть свой ключ. Поэтому ключ в сервис будем передавать в зависимости от наличия определенных параметров, которые могут задаваться в локальном конфиге. Для этого напишем и подключим CompilerPass.
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;

class CredentialsPass implements CompilerPassInterface
{
    public function process(ContainerBuilder $container)
    {
        $googleClient = $container->getDefinition('google.client'); //Имя сервиса который мы объявили в предыдущем абзаце

        if ($container->hasParameter('google_p12_path') && $container->hasParameter('google_p12_email')) {
            $path = $container->getParameter('google_p12_path');
            $email = $container->getParameter('google_p12_email');

            $googleClient->addMethodCall('setCredentialsP12', [$path, $email]);
        } elseif ($container->hasParameter('google_json_path')) {
            $googleClient->addMethodCall('setCredentialsJson', [$container->getParameter('google_json_path')]);
        }
    }
}

И теперь нам достаточно написать в локальном конфиге.
parameters:
    google_p12_path: my-certificate.p12
    google_p12_email: my-email@mail.com
или
parameters:
    google_json_path: my-certificate.json


Получение списка событий


Теперь у нас есть сервис и мы можем запросить список событий.
try {
    /* @var $start \DateTime */
    $start;

    /* @var $end \DateTime */
    $end;

    $events = $google->getCalendar()->events->listEvents('example@mail.com', [
        'timeMin' => $start->format('c'),
        'timeMax' => $end->format('c'),
    ]);
} catch (\Google_Service_Exception $exception) {
    //TODO implement error catching
}

Для каждого календаря есть свой уникальный email (example@mail.com в примере выше). С помощью метода listEvents здесь мы получаем все события из нашего календаря за определенный промежуток времени. Гугл использует стандарт ISO 8601 для временных параметров (timeMin, timeMax), так что для форматирования времени достаточно использовать букву c.

Вместо заключения


Потратив немного времени, мы получаем доступ из нашего проекта к google calendar. Дальше можно развивать эту интеграцию, например можно организовать более сложный поиск или добавление событий из нашего проекта. И если вы готовы доверить свои календари (а может и не свои) гуглу, то вы можете получить за дешево очень мощный инструмент, который при этом можно гибко подстроить под ваши нужды.
Tags:
Hubs:
+6
Comments 1
Comments Comments 1

Articles