CodeIgniter で「google-api-php-client」を使おうとして大変な思いをした。

訳あって、Codeigniter で 「Google APIs Client Library for PHP(以下、google-api-php-client)」 を使えるようにする必要がありました。素の PHP だと、もっと導入は簡単だと思うのですが、CodeIgniter に持ち込もうとすると、けっこう骨が折れます。


まず google-api-php-client をダウンロードしましたが、CodeIgniter 力が低いため、どこにどう埋め込み、設定をすればよいのか、検討がつきません。これは、すでに CodeIgniter に埋め込むための実装を作っている人がいるだろうと思い、探し始めました。


いました → https://github.com/joeauty/Google-API-Client-CodeIgniter-Spark


ただし、更新が止まっています。
google-api-php-client のバージョンが v0.6.0 表記だったのですが、現時点での最新バージョンは google-api-php-client v0.6.7 となっていました。結構古いので、ちょっと悩みましたが、導入が終わったあとで、自分で v0.6.7 に置き換えれば良さそうに見えたので、とりあえず見なかったことにしました。

この「joeauty/Google-API-Client-CodeIgniter-Spark」は、「https://github.com/joeauty/Google-API-Client-CodeIgniter-Spark」の README が最も詳しいヘルプなので、なにか困ったときは、ココに戻ってくるのをオススメします。(ハマるポイントもありますが)




さて、どうやってインストールすればいいのかな?と思ったのですが、こちらのページを見ると「spark」という文字が見えます。
「Sparks」のお勉強からはじめなきゃいけないようです。

こちらの記事を参考に、簡単な Sparks の概要を掴んでみてください。

CodeIgniter Sparks を使ってみる



Sparks 経由で、「joeauty/Google-API-Client-CodeIgniter-Spark」をインストールするのが、一番よさそうに思えました。というわけで、Sparks のインストール方法を見てみることにします。

CodeIgniter Sparks | Setting Up

Sparks のインストール方法には、2通りあるようです。

  • Spark Package Manager を使った方法(※ 公式サイトではこちらを推奨)
  • Spark Package Manager を使わない方法(Installing Sparks Manually)

訳あって、今回 CodeIgniter を使っていますが、すぐに使わなくなる可能性があるので、あまり余計なものは入れたくないなぁと考えています。なので、今回は Spark Package Manager を使わないで Sparks を利用する方(後者)でやってみることにします。


やり方は、上記のページの「Option 2. Setting up without the Spark Manager」が詳しいので、参考にしてみてください。これは簡単です。




Sparks をインストールする準備が整ったら、いよいよ「joeauty/Google-API-Client-CodeIgniter-Spark」をインストールします。getsparks.org にもアップされていたので、そちらを参考にインストールしてみました。

参考:http://getsparks.org/packages/GoogleAPIClient/versions/HEAD/show

$ php tools/spark install -v0.6.0 GoogleAPIClient
> Could not open input file: tools/spark

あれ。駄目でした。

うーん。とよく見ていると、これは Spark Package Manager を使った時のインストール方法ので、手動インストール型の今回では使えない方法でした。うむう。
親切に、こちらのページにちゃんと書いてありますね。見落としていました。

http://getsparks.org/get-sparks
=> (Installing Sparks Manually の項)

「joeauty/Google-API-Client-CodeIgniter-Spark」をダウンロードし、次のような感じで、CodeIgniter のアプリケーションディレクトリに展開します。

/application
/system
/sparks
..../GoogleAPIClient
......../0.6.0
............/config
............/libraries

チュートリアルにある感じで、次のように CodeIgniter から呼び出してみました。

  $this->load->spark('GoogleAPIClient/0.6.0');

とすると、もれなく次のようなエラーメッセージがでて怒られます。

Cannot find spark path at sparks/GoogleAPIClient/0.6.0/

パスが悪いんかな?と思って、ぐぐってみました。

Cannot find codeigniter spark path at sparks

core/MY_Loader.php に define('SPARKPATH', 'sparks/'); ってのがあるけど、define('SPARKPATH', APPPATH.'sparks/'); という風にするといいよ!って話だったのですが、エラーが解決しませんでした。



うーんと唸りながら「https://github.com/joeauty/Google-API-Client-CodeIgniter-Spark」を見ていた所、次のような記事に気づきました。

Normally this would be:

load->spark('GoogleAPIClient/0.6.0');
?>
but this doesn't actually do anything since there are no CodeIgniter-esque config files, helpers, or libraries within this Spark. Just follow the example code (some included below) to init this Spark.

One note though, because you'll probably want to speak to Google within a CodeIgniter controller, you'll need to make available the variables defined in the included configuration file (see below) in your controller, which you can do as such (include this line before you start speaking to Google).

エラーが解決しない理由ではありませんが、結局のところ「$this->load->spark」の件はなにもやってないので、スキップしても良さそうです。
こちらのページに書いてあるサンプルをベースに、次のように記述してみました。

global $apiConfig;

require_once SPARKPATH . "GoogleAPIClient/0.6.0/src/apiClient.php";
require_once SPARKPATH . "GoogleAPIClient/0.6.0/src/contrib/apiCalendarService.php";

// init API
$apiClient = new apiClient();

すると...

Message: require_once(../application/sparks/GoogleAPIClient/0.6.0/src/apiClient.php): failed to open stream: Permission denied

こんな感じのエラーが出ました。
こちらの記事と同じ症状ですね → http://stackoverflow.com/questions/17454163/how-to-include-3rd-party-libraries-in-codeigniter

ファイルパーミッションを確認してみたところ、次のような感じでした。

drwx------@  4 owner staff   136  2 19 01:22 GoogleAPIClient

ディレクトリをコピーしてきた時にパーミッションがおかしくなったみたいですね。
パーミッションを、次のような感じで再設定します。

$ chmod -R 755 GoogleAPIClient

これでもう一度アクセスしてみると、今度はファイルが見つからない。というエラーに変わりました。
「GoogleAPIClient/0.6.0/src/apiClient.php」というファイルは... 確かにない... w
README がちょっと古いみたいですね。。

require_once 'google-api-php-client/src/Google_Client.php';

とすることで、「$client = new Google_Client();」のように呼び出しができるようになりました。
けっこう落とし穴が多かったですね...。



ようやく、本題の Google API の操作に取り掛かれそうです。
ご参考まで。