Laravelで構築したアプリケーション内でカレンダーを利用したいという要件がある場合にGoogle Calendar APIを利用することでLaravelからGoogle Calenderを操作することができます。

本文書ではLaravelを利用してGoogle Calendarを操作するまでの設定と使用方法について2つの方法で行っています。一つはgoogle/apiclientパッケージを直接利用する方法もう一方はLaravelからより簡単にカレンダーを操作するために作成されたspatie/laravel-google-calendarパッケージを利用した方法です。

最初にgoogle/apiclientを使って動作確認を行い確認し、その後spatie/laravel-google-calendarを使った方法でイベントの取得を行います。

spatie/laravel-google-calendarパッケージも内部ではgoogle/apiclientを利用しています。
fukidashi

PHPでGoogle Calendarを操作したい場合は以下の文章が参考になります。

環境設定

認証設定

Laravelフレームワークやプログラム言語に関わらずAPI経由でGoogle Calendarを操作するためには認証設定を行う必要があります。認証設定についてはプログラム言語を超えて共通なものなので以下の文書を参考に設定をおこなってください。

認証の設定作業が完了するとサービスアカウントIDとアクセスに必要な秘密鍵の情報等が含まれるキーファイルを取得することができます。サービスアカウントIDはGoogle Calendarのアクセス設定、キーファイルはアクセスする際に利用します。

Google Calendarの設定

Google Calendar上ではアクセス許可の設定を行う必要があります。サービスアカウントを作成したユーザでGoogle Calendarにログインしてください。

カレンダーの追加

既存のカレンダーを利用することもできますが動作確認用に新規でカレンダーの追加を行います。マイカレンダーから新しいカレンダーを作成するをクリックします。

既存のカレンダーを利用する場合は新しくカレンダーを追加する必要はありませんのでカレンダーのアクセス設定に進んでください。
fukidashi
新しいカレンダーの作成
新しいカレンダーの作成

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

新しいカレンダーの作成
新しいカレンダーの作成

カレンダーのアクセス設定

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

カレンダー設定
カレンダー設定

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

動作確認用カレンダーの選択
動作確認用カレンダーの選択

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

特定のユーザとの共有画面
特定のユーザとの共有画面

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

ユーザの設定画面
ユーザの設定画面

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

サービスアカウントIDの設定
サービスアカウント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"
GOOGLE_CALENDAR_IDの値はgoogle calendar内で取得したカレンダーIDです。環境によって異なる値です。
fukidashi

イベント一覧を取得

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へアクセスを行います。

ブラウザでアクセスする前は必ずphp artisan servコマンドで開発サーバを起動させておく必要があります。
fukidashi

コードの中でイベントのタイトルのみ表示されるので以下の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を利用したほうが短いコードで記述できることが確認できました。