はじめに
こんばんは。
もうコレ関連やるたびに毎回ググって時間かかっちゃうので、まとめときます。
GoogleのDeveloperサイトで、GoogleCalendarAPIのサービスの使用を許可しているのが前提です。
本題
1. 必要パッケージのインストール
以下を落としてきます。
composer require google/apiclient
2. 使用するクラス群
GoogleCalendarConfig.php
<?php namespace Kojirock\Resource; class GoogleCalendarConfig { /** * @var string */ private $authConfigPath; /** * @var string */ private $calendarId; /** * GoogleCalendarConfig constructor. * @param array $configData */ public function __construct(array $configData) { foreach ($this as $key => $val) { if (!isset($configData[$key])) { throw new \InvalidArgumentException("{$key} is property nothing"); } $this->$key = $configData[$key]; } } /** * @return string */ public function getAuthConfigPath() { return $this->authConfigPath; } /** * @return string */ public function getCalendarId() { return $this->calendarId; } }
GoogleCalendar.php
<?php namespace Kojirock\Infrastructure\Adapter\Google; use Kojirock\Resource\GoogleCalendarConfig; class GoogleCalendar { /** * @var GoogleCalendarConfig */ private $googleCalendarConfig; /** * GoogleCalendar constructor. * @param GoogleCalendarConfig $googleCalendarConfig */ public function __construct(GoogleCalendarConfig $googleCalendarConfig) { $this->googleCalendarConfig = $googleCalendarConfig; } /** * @return \Google_Service_Calendar * @throws \Google_Exception */ public function createInstanceGoogleCalendarService() { $client = new \Google_Client(); $client->setAuthConfig($this->googleCalendarConfig->getAuthConfigPath()); $client->setScopes(\Google_Service_Calendar::CALENDAR_EVENTS_READONLY); return new \Google_Service_Calendar($client); } /** * 祝日データを取得する * @param string $startDate * @param string $endDate * @return array * @throws \Google_Exception */ public function fetchHolidays($startDate, $endDate) { $service = $this->createInstanceGoogleCalendarService(); $response = $service->events->listEvents($this->googleCalendarConfig->getCalendarId(), [ 'timeMin' => $startDate, 'timeMax' => $endDate, 'singleEvents' => true, 'orderBy' => 'startTime', 'timeZone' => 'Asia/Tokyo', ]); $results = []; foreach ($response->getItems() as $k => $item) { $results[$item->getStart()->getDate()] = $item->getSummary(); } return $results; } }
execute.php
<?php $googleCalendarConfig = new \Kojirock\Resource\GoogleCalendarConfig([ 'authConfigPath' => 'DeveloperサイトからDLしてきたJsonファイルまでのパス', 'calendarId' => 'ja.japanese#holiday@group.v.calendar.google.com', ]); $googleCalendar = new \Kojirock\Infrastructure\Adapter\Google\GoogleCalendar($googleCalendarConfig); // 例えば、今月から1年先の祝日データを取得する $startDate = \Carbon\Carbon::now()->startOfMonth()->format('c'); $endDate = \Carbon\Carbon::now()->startOfMonth()->addYear(1)->format('c'); $holidays = $googleCalendar->fetchHolidays($startDate, $endDate); var_dump($holidays);
実行結果
array(22) {
'2019-08-11' =>
string(9) "山の日"
'2019-08-12' =>
string(22) "山の日 振替休日"
'2019-09-16' =>
string(12) "敬老の日"
'2019-09-23' =>
string(12) "秋分の日"
'2019-10-14' =>
string(12) "体育の日"
'2019-10-22' =>
string(39) "即位礼正殿の儀の行われる日"
'2019-11-03' =>
string(12) "文化の日"
'2019-11-04' =>
string(25) "文化の日 振替休日"
'2019-11-23' =>
string(18) "勤労感謝の日"
'2020-01-01' =>
string(6) "元日"
'2020-01-13' =>
string(12) "成人の日"
'2020-02-11' =>
string(18) "建国記念の日"
'2020-02-23' =>
string(15) "天皇誕生日"
'2020-02-24' =>
string(28) "天皇誕生日 振替休日"
'2020-03-20' =>
string(12) "春分の日"
'2020-04-29' =>
string(12) "昭和の日"
'2020-05-03' =>
string(15) "憲法記念日"
'2020-05-04' =>
string(15) "みどりの日"
'2020-05-05' =>
string(15) "こどもの日"
'2020-05-06' =>
string(28) "憲法記念日 振替休日"
'2020-07-23' =>
string(9) "海の日"
'2020-07-24' =>
string(12) "体育の日"
}
終わりに
こんな感じ祝日データをとってきました。
GoogleCalendarAPIを使って祝日とってくる作業って、記憶に残ってるだけで4回目くらいだったのに、それでも毎回忘れてるのでコードそのまま残しときました。
↓を見る限り、一日100万回の制限があるっぽいんですが、バッチとかで1日1回取得して、RedisとかにキャッシュしとけばOKかなとか思います。
現場からは以上です。