Google Calendar APIを使いイベントを作成しカレンダーに反映させる方法

Google Calendar APIを使うための事前準備ガイド
の続きになっております

:::note info
4.エディターにコードを書きイベントを作成
5.ルートを作成しテスト実施(api.php)
6.ルートを作成しテスト実施(web.php)
について説明します。Google Calender Apiの準備はできているけどコードの書き方がわからないという方は参考にしてもらえたらなと思います。
:::


### 環境は以下のようになっています
php:  PHP 8.2.9
DB: MySql
エディター: vscode

# 4.エディターにコードを書きイベントを作成
4-1: Googleが提供するPHP用のGoogle APIクライアントライブラリをインストールします。言語によってコマンドが違います。
```
composer require google/apiclient:^2.0  
```



4-2: コードを書くコントローラーを作成します
```
 php artisan make:controller GoogleCalendarController

```

4-3: イベント作成のコードを書いていきます。
詳細はApiリファレンスのイベント/Insertで確認できます
https://developers.google.com/calendar/api/v3/reference/events/insert?hl=ja
```php

<?php
namespace App\Http\Controllers;

use Google\Client;
use Google\Service\Calendar\Event as Google_Service_Calendar_Event; 
use Google\Service\Calendar as Calendar;    

class GoogleCalendarController extends Controller
{
    public function createEvent()
    {
        $client = new Client();

        // 認証情報を設定（.envでサービスアカウントJSONファイルのパスを設定）
        $client->setAuthConfig(env('GOOGLE_CALENDAR_API_KEY'));

        //Google カレンダーにアクセスするための権限をリクエスト
        $client->addScope(Calendar::CALENDAR);

        //Google Calendar API へのアクセスを提供するサービスオブジェクトを作成
        $service = new Calendar($client);

        // イベントの詳細を設定 //ここは自由に設定してください  
        $event = new Google_Service_Calendar_Event([
            'summary' => 'テストイベント',
            'location' => '東京都',
            'description' => 'このイベントはテストです。',
            'start' => [
                'dateTime' => '2024-11-24T10:00:00', 
                'timeZone' => 'Asia/Tokyo',
            ],
            'end' => [
                'dateTime' => '2024-11-24T12:00:00',
                'timeZone' => 'Asia/Tokyo',
            ],
        ]);

        //カレンダーIDを取得 //.envに貼り付けたカレンダーIdを読み込む
        $calendarId = env('GOOGLE_CALENDAR_ID');
        
        try {
            //指定したカレンダーに新しいイベントを追加
            $event = $service->events->insert($calendarId, $event);
            
            return response()->json([
                'message' => 'イベントが作成されました。',
                'eventId' => $event->getId()
            ]);
        } catch (\Exception $e) {
            return response()->json([
                'error' => 'イベント作成に失敗しました: ' . $e->getMessage()
            ], 500);
        }
    }
}
```
今回はまだ試作段階ですのでこのような感じになっております。

:::note info
setAuthConfigにサービスアカウントを作成した際にダウンロードされたJsonファイルのpathをenv経由で読み込む

$calendarIdに自身のGoogle CalenderのIdをenv経由で読み込む
詳細は前章に記載しております。
:::


# 5: postmanでのテストを行い、Google Calenderを見ていきます。
テストを行うにあたりルートをapi.phpを作成する必要があるため作成します。
```php:api.php
<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
//先ほど作成したGoogleCalendarControllerを読み込む    
use App\Http\Controllers\GoogleCalendarController;

Route::post('/create-event', [GoogleCalendarController::class, 'createEvent']);
```
リクエストを送ります。今回はリクエスト内容をコードに書きましたのでbodyは空で行います。
![スクリーンショット 2024-11-19 21.46.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3931703/8a2b785e-baaf-c91f-f90e-876b5954df2b.png)

以下のようにレスポンスが帰ってきたため成功と言えます。
![スクリーンショット 2024-11-20 0.08.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3931703/6ae7d806-0d89-948b-b5b3-dfc64a7dd20f.png)


Google Calenderを見てみます。
GoogleCalenderControllerでdatetimeに設定した日付を確認します。以下のように予約が入ります。
![スクリーンショット 2024-11-19 21.56.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3931703/42b078d4-9322-eafb-795d-8c1bac229eab.png)

# 6 postmanを使わずweb.phpにルートを書き行なってみます。
イベントを作成するのにGETを使うと違和感がありますが、コード内でイベントの作成をまずは行いたいためこのまま進めます。

6-1: ルートの作成
```php:web.php
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\GoogleCalendarController;  

//プラウザではGETメソッドでアクセスするため、Route::getを使用   
Route::get('/create-event', [GoogleCalendarController::class, 'createEvent']);
```
GoogleCalendarControllerの方で予約の日付を25日へ変更しました。
先ほどweb.phpで作成したルートをプラウザで叩きます。
http://127.0.0.1:8000/create-event

Google Calendarで確認すると同様に予約ができています。
![スクリーンショット 2024-11-19 22.13.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3931703/af5fac66-28c5-4d5d-1985-16f36e5e4ba3.png)

# 最後に
Google Calendar APIを使用し予約アプリを作りたいと思い今回作成しました。今のままだとコードに書いた予約しか作れないため今後、改良していきたいと思っております。

ご覧いただきありがとうございます。
以上になります。