symfony1.4でZnedFrameworkのOAuthを使う

もうすぐSymfony2が出ますね!楽しみですね!
でも、まだsymfony1.4もバリバリ現役ですよシリーズです。

twitterのOAuthをやりたくて...

symfony1.4のアプリケーションでtwitter連携をしようと思い色々とライブラリを探してみた結果、手堅くということでZendFrameworkのOAuthライブラリを使うことにしました。。が、symfony1.4以降でのLoaderの設定を含めたやりかたが公式サイトにちょこっと掲載されているだけなので自分のためにメモしておきます。

プラグインで拡張する

複数のアプリケーションで使うこともあるでしょうし、将来違うプロジェクトでも使うことがあるかもということでごく普通にプラグインとして以下のような構造で用意しました。プラグインの中にOAuthを動かすために必要な最小限のZendのライブラリをlib/vendor/Zendディレクトリにコピーしてあります。


Znedのautoloadを設定する

symfony 1.x legacy websiteで紹介されているやりかたと基本同じです。違うのはライブラリのパスはプラグインの中に含めているので、プラグインのXXXPluginConfigurationクラスにプラグインのパスで指定することです。

<?php
class apTwitterPluginConfiguration extends sfPluginConfiguration
{
  /**
   * @see sfPluginConfiguration
   */
  public function initialize()
  {
      self::registerZend();
  }
  static protected $zendLoaded = false;
  static public function registerZend()
  {
    if (self::$zendLoaded)
    {
      return;
    }
    set_include_path(dirname(dirname(__FILE__)).'/lib/vendor'.PATH_SEPARATOR.get_include_path());
    require_once dirname(dirname(__FILE__)).'/lib/vendor/Zend/Loader/AutoLoader.php';
    Zend_Loader_Autoloader::getInstance();
    self::$zendLoaded = true;
  }
}

ググってみるとautoload.ymlに書けばOKという解説の記事もありますけど、パスが通るだけでZendライブラリ内でrequireされたファイルへのパスが通らないのでZendFrameworkと連携するのであればZend_Loader_Autoloader::getInstace()を使うことになると思います。また、この書き方もZendFrameworkのバージョンによって違うので古いバージョンの場合は(多分)動かないはずです。

routing.ymlを設定

twitterの認証画面に進むためのルーティングと、callbackのルーティングを定義しておきます。

twitter_login:
  url:   /twitter_login
  param: { module: apTwitter, action: login}
twitter_callback:
  url:   /twitter_callback
  param: { module: apTwitter, action: callback}

定義せずにコード中にハードコーディングしても良いですが、routing.ymlをつかって置けば、callback先の開発環境、本番環境のホスト名の違いなどを意識しなくてよいので便利ですよ。

actionの例

あとは見慣れたアクションクラスを書くだけです。routing.ymlでルーティングを設定したのでUrlヘルパーを読み込み、callback先のURLを取得できるようにしている点ぐらいです。

<?php
class apTwitterActions extends sfActions
{
  public function executeLogin($request)
  {
      $this->getContext()->getConfiguration()->loadHelpers(array('Url'));
      $config = array(
          'requestScheme' => Zend_Oauth::REQUEST_SCHEME_HEADER,
          'signatureMethod' => 'HMAC-SHA1',
          'callbackUrl' => url_for('@twitter_callback', true),
          'requestTokenUrl' => 'http://twitter.com/oauth/request_token',
          'authorizeUrl' => 'http://twitter.com/oauth/authorize',
          'accessTokenUrl' => 'http://twitter.com/oauth/access_token',
          'consumerKey' => 'コンシューマーキー',
          'consumerSecret' => 'コンシューマーパスフレーズ'
      );
      $consumer = new Zend_Oauth_Consumer($config);
      // fetch a request token
      $token = $consumer->getRequestToken();
      $consumer->redirect();
      return sfView::NONE;
  }
  public function executeCallback($request)
  {
     // callback時にセッションやDBにごにょごにょ...
  }
}

使い方はTwitterクライアントのOAuth認証(Zend_Oauth) – シンプルなTwitterクライアントの作成 – | エンジニア ブログを参考にさせていただきました。