Google CalendarをLaravelから操作

Laravelで構築したアプリケーション内でカレンダーを利用したいという要件がある場合にGoogle Calendar APIを利用することでLaravelからGoogle Calenderを操作することができます。
本文書ではLaravelを利用してGoogle Calendarを操作するまでの設定と使用方法について2つの方法で行っています。一つはgoogle/apiclientパッケージを直接利用する方法もう一方はLaravelからより簡単にカレンダーを操作するために作成されたspatie/laravel-google-calendarパッケージを利用した方法です。
最初にgoogle/apiclientを使って動作確認を行い確認し、その後spatie/laravel-google-calendarを使った方法でイベントの取得を行います。

PHPでGoogle Calendarを操作したい場合は以下の文章が参考になります。
目次
環境設定
認証設定
Laravelフレームワークやプログラム言語に関わらずAPI経由でGoogle Calendarを操作するためには認証設定を行う必要があります。認証設定についてはプログラム言語を超えて共通なものなので以下の文書を参考に設定をおこなってください。
認証の設定作業が完了するとサービスアカウントIDとアクセスに必要な秘密鍵の情報等が含まれるキーファイルを取得することができます。サービスアカウントIDはGoogle Calendarのアクセス設定、キーファイルはアクセスする際に利用します。
Google Calendarの設定
Google Calendar上ではアクセス許可の設定を行う必要があります。サービスアカウントを作成したユーザでGoogle Calendarにログインしてください。
カレンダーの追加
既存のカレンダーを利用することもできますが動作確認用に新規でカレンダーの追加を行います。マイカレンダーから新しいカレンダーを作成するをクリックします。


名前は動作確認用カレンダーとします。名前は任意なので好きな名前をつけてカレンダーを作成ボタンをクリックしてください。

カレンダーのアクセス設定
新しいカレンダーを作成後、Google Calendarの画面の右上部にある歯車のアイコン、設定をクリックしてください。

設定画面が開いたら、左側のメニューにある動作確認用カレンダーを選択してください。

左側のメニューの特定のユーザとの共有をクリックするか右側の画面をスクロールして特定のユーザーとの共有画面にログインしたユーザのメールアドレスが表示されていることを確認し、その下のユーザーを追加をクリックしてください。

ここでは認証設定で取得したサービスアカウントIDを入力します。

メールアドレスを入力後、権限は予定の変更権限に変更し送信ボタンをクリックしてください。

送信により追加が完了するとgoogleアカウントの下にサービスアカウントIDの情報が表示されます。ユーザの追加は完了です。

作成したカレンダーのIDを取得
次にカレンダーの統合に移動して、カレンダーのIDを取得してください。APIでアクセスする際に必要となるIDです。

Laravelのインストール
composerコマンドを使ってLaravelのインストールを行います。
$ composer create-project --prefer-dist laravel/laravel laravel_google_calendar
インストールしたLaravelのバージョンは6.11.0です。
$ php artisan -V
Laravel Framework 6.11.0
google/apiclientパッケージのインストール
Google CalendarにAPI経由でアクセスするためにgoogle/apiclientパッケージを利用します。google/apiclientパッケージもcomposerコマンドでインストールを行います。
$ composer require google/apiclient:^2.0
秘密鍵のキーファイルの保存
認証設定で取得した秘密鍵のキーファイルをLaravelからアクセスできる場所に保存します。Laravelのインストールディレクトリのstorage/appの下にgoogle-calendarディレクトリを作成しキーファイルを保存します。
Google Calenderの操作
コントローラーファイルの作成
動作確認用にコントローラーファイルを作成します。
$ php artisan make:controller GoogleCalendarController
web.phpファイルにはルーティングを追加します。
Route::get('/', function () {
return view('welcome');
});
Route::resource('/calendar', 'GoogleCalendarController');
環境変数の設定
カレンダーIDは.envファイルに登録を行います。.envファイルの最後に追加してください。GOOGLE_CALENDAR_IDは任意の名前をつけることができます。
GOOGLE_CALENDAR_ID = "XXXXXXXXX@group.calendar.google.com"

イベント一覧を取得
GoogleCalendarController.phpファイルを使ってGoogle Calendarに登録されているイベントを取得します。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Google_Client;
use Google_Service_Calendar;
class GoogleCalendarController extends Controller
{
public function index(){
$client = $this->getClient();
$service = new Google_Service_Calendar($client);
$calendarId = env('GOOGLE_CALENDAR_ID');
$optParams = [];
$results = $service->events->listEvents($calendarId, $optParams);
$events = $results->getItems();
foreach($events as $event){
echo $event->getSummary().'
';
}
}
public function getClient()
{
$client = new Google_Client();
$client->setApplicationName('Google Calendar API plus Laravel');
$client->setScopes(Google_Service_Calendar::CALENDAR_READONLY);
$client->setAuthConfig(storage_path('app/google-calendar/XXXXXXX.json'));
return $client;
}
}
カレンダーのIDについては.envファイルに保存されているのでヘルパー関数envにパラメータを設定して取得しています。
$client->setAuthConfigメソッドではキーファイルを指定しています。保存した場合はヘルパー関数のstorage_pathを利用しています。
ブラウザでhttp://127.0.0.1:8000/calendarへアクセスを行います。

コードの中でイベントのタイトルのみ表示されるので以下の2つが表示されます。

カレンダーは下記のようになっています。

spatie/laravel-google-calendarパッケージを利用
インストールや初期設定についてはhttps://github.com/spatie/laravel-google-calendarを参考に行なっています。
パッケージのインストールと設定
spatie/laravel-google-calendarパッケージはcomposerコマンドでインストールを行います。
$ composer require spatie/laravel-google-calendar
サービスプロバイダーの設定を行います。config¥app.phpファイルを開いて下記を追加します。
'providers' => [
・
・
Spatie\GoogleCalendar\GoogleCalendarServiceProvider::class,
],
設定ファイルの作成を行います。configディレクトリにgoogle-calendar.phpファイルが作成されます。
$ php artisan vendor:publish --provider="Spatie\GoogleCalendar\GoogleCalendarServiceProvider"
Copied File [/vendor/spatie/laravel-google-calendar/config/google-calendar.php] To [/config/google-calendar.php]
Publishing complete.
Publishing complete.
中身は下記の通りで秘密鍵のキーファイルとカレンダーIDの設定を行なっています。
<?php
return [
/*
* Path to the json file containing the credentials.
*/
'service_account_credentials_json' => storage_path('app/google-calendar/service-account-credentials.json'),
/*
* The id of the Google Calendar that will be used by default.
*/
'calendar_id' => env('GOOGLE_CALENDAR_ID'),
];
.envファイルへのGOOGLE_CALENDAR_IDの設定は完了していますが、キーファイルのファイル名が異なっているので、保存したファイルをservice-account-credentials.jsonに変更するかgoogle-calendar.phpファイル内の設定値を変更するかどちらかの変更を行なってください。
カレンダーのイベントの取得
GoogleCalendarController.phpファイルを以下のように書き換えます。spatie/laravel-google-calendarでは下記のように短いコードでGoogle Calendarからイベントを取得することができます。
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Spatie\GoogleCalendar\Event;
class GoogleCalendarController extends Controller
{
public function index(){
$event = new Event;
$events = Event::get();
foreach($events as $event){
echo $event->name.'
';
}
}
}

google/apiclientでもspatie/laravel-google-calendarでもイベントを取得することは可能ですがspatie/laravel-google-calendarを利用したほうが短いコードで記述できることが確認できました。