スポンサーリンク

TwitterOAuthをcakephp.shellで使う場合にはまった件(2016年2月現在)

TwitterOAuthは便利なライブラリなんですが、いかんせんcakeで使うには情報が錯そうしていてよくわからない。

いろいろ試してみた。

スポンサーリンク

composerから入れる

今回はcomposerからのインストールを試みました。
composer.jsonに下記を追加

	"require": {
		"abraham/twitteroauth": "0.5.0",
	},

composerで更新をかけるとAPP/Vendor/abraham/twitteroauth/src/ のフォルダに本体がダウンロードされます。
で、この中にあるTwitterOAuth.phpをロードしたいのですが…

ここで情報が錯そうします。
ファイル名がTwitterOAuth.phpだったり小文字だけのtwitteroauth.phpだったりまちまちなのです。
今回はキャメルケース記法のTwitterOAuth.phpだったので

App::build(array('Vendor' => array(APP . 'Vendor' . DS . 'twitteroauth')));
App::uses('TwitterOauth', 'Vendor');

と書けばいいはずなのですがなぜかダメ。

じゃ、app::import()をつかう

ほかの書き方としてapp::import()でロードする方法もあります。
これはcakeのルールに従っていないファイルをロードする場合に使うものです。
が、

App::build(array('Vendor' => array(APP.'Vendor/abraham/twitteroauth/src/')));
App::import('Vendor','abraham/twitteroauth/src/TwitterOAuth');

なんか、Configクラスがないといわれます。
ということで、Configを追加してみましたが今度は他のがないといわれるので、順番に全部ロードしていくと
こうなりました

App::import('Vendor','abraham/twitteroauth/src/Config');
App::import('Vendor','abraham/twitteroauth/src/Response');
App::import('Vendor','abraham/twitteroauth/src/SignatureMethod');
App::import('Vendor','abraham/twitteroauth/src/HmacSha1');
App::import('Vendor','abraham/twitteroauth/src/Consumer');
App::import('Vendor','abraham/twitteroauth/src/Token');
App::import('Vendor','abraham/twitteroauth/src/Request');
App::import('Vendor','abraham/twitteroauth/src/Util');
App::import('Vendor','abraham/twitteroauth/src/Util/JsonDecoder');
App::import('Vendor','abraham/twitteroauth/src/TwitterOAuth');
use Abraham\TwitterOAuth\TwitterOAuth;

一応、これでもツイートは取得できたのですが…。なんかファイルをロードする順番でまずいことが起こるような感じでした。
あと、なんだかスマートじゃない…

composerのautoloaderにお任せ

実は、composerにはautoloaderなるものが入っていて、自動でincludeしてくれるらしいのです!
ただ、cakeで使うには問題があるらしく、bootstrap.phpで以下のような内容を書く必要があるようです。

// composerのautoloadを読み込み
require APP . '/Vendor/autoload.php';
// CakePHPのオートローダーをいったん削除し、composerより先ににする
// https://github.com/composer/composer/commit/c80cb76b9b5082ecc3e5b53b1050f76bb27b127b を参照
spl_autoload_unregister(array('App', 'load'));
spl_autoload_register(array('App', 'load'), true, true);
CakePlugin::loadAll();

で、あとは、実際に使いたいファイルの先頭で

use Abraham\TwitterOAuth\TwitterOAuth;

こんな感じでロードすればOKのようです。