綺麗に死ぬITエンジニア

Composerで追加したクラスをそのままLaravel 5で使う方法(TwitterOAuth)

2017-01-27

オープンソースの文化が活発化してくれたおかげで、今や、様々なプログラミング言語で色々なライブラリが無料で利用できます。

Laravelを利用する上でも、Laravel用のライブラリがComposer経由でたくさんあります。しかし当然ながら、Composerで手に入るほとんどのライブラリは、Laravel用に最適化して作られたものではなく、通常のクラスとして提供されているものです。

今回は、Composerで手に入れた通常のクラスの、Laravel上で便利に利用するための導入手順を書いていきます。

前提

今回は例として、PHP用のTwitter API接続用ライブラリである、TwitterOAuthをLaravelに導入していきます。

今回紹介する方法はサービスプロバイダとファサードを用いてクラスを利用するものです。通常、設定値を持ち、インスタンス化(new)して利用するようなライブラリに対して行うものです。

なお、今回動作確認したLaravelのバージョンは5.4です。

導入したいクラスのインストール

まずはじめに、導入したいクラスをインストールしておきます。

今回は例としてTwitterOAuthクラスを導入します。

composer require abraham/twitteroauth

設定ファイルの用意

まず、TwitterOAuthを利用する上で必要な設定値を設定ファイルとして用意します。

Twitter APIは、認証に必要なAPIキーとして、「Consumer Key」「Consumer Secret」「Access Token」「Access Token Secret」の4つを必要とします。TwitterOAuthクラスのコンストラクタの引数も、この4つのパラメータです。

なので、Twitter用の設定ファイルをconfig/twitter.phpとして、以下の内容で作成しましょう。

<?php

return [
    'consumer_key' => env('TWITTER_CONSUMER_KEY', ''),
    'consumer_secret' => env('TWITTER_CONSUMER_SECRET', ''),
    'access_token' => env('TWITTER_ACCESS_TOKEN', ''),
    'access_token_secret' => env('TWITTER_ACCESS_TOKEN_SECRET', ''),
];

そして、実際の利用時には、.envファイルに設定値を追記しておきましょう。

...
TWITTER_CONSUMER_KEY=XXXXXXXXXXXXXXXXXXXXXXXXX
TWITTER_CONSUMER_SECRET=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
TWITTER_ACCESS_TOKEN=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
TWITTER_ACCESS_TOKEN_SECRET=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
...

これで設定ファイルの準備はOKです。

サービスプロバイダの作成

TwitterOAuthクラスを提供するためのクラス(サービスプロバイダ)の定義をしていきます。

app/Providers/TwitterServiceProvider.phpを、以下の内容で作成しましょう。

<?php

namespace App\Providers;

use Abraham\TwitterOAuth\TwitterOAuth;
use Illuminate\Support\ServiceProvider;

class TwitterServiceProvider extends ServiceProvider
{
    /**
     * Indicates if loading of the provider is deferred.
     *
     * @var bool
     */
    protected $defer = true;

    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->singleton('twitter', function () {

            $config = config('twitter');

            return new TwitterOAuth($config['consumer_key'], $config['consumer_secret'], $config['access_token'], $config['access_token_secret']);

        });
    }

    /**
     * Get the services provided by the provider.
     *
     * @return array
     */
    public function provides()
    {
        return ['twitter'];
    }
}

説明を加えると、registerメソッド内で、サービスコンテナ(Laravelで利用するサービスを集めたもの)の中に、TwitterOAuthクラスのインスタンスを'twitter'という名前で登録しています。また、ヘルパー関数のconfigを通じて、先ほど用意したconfig/twitter.phpの中身を参照し、インスタンスを作成しています。

singletonメソッドを通じて登録すると、何度呼ばれても、中のコンストラクタは1度しか呼ばれず、インスタンスを返します。都度インスタンスを生成し直したい場合は、bindメソッドを利用します。

また、deferプロパティにtrueをセットし、providesメソッドで登録したサービスコンテナ名を返すことで、プロバイダのローディングを、実際に必要になるまで遅延します。

サービスプロバイダについて詳しく知りたい方は、こちらをご覧ください。

サービスプロバイダの登録

では、作成したTwitterServiceProviderクラスを、アプリケーションに登録します。

config/app.phpproviders配列へ、クラス名を追加するだけです。

'providers' => [
    // Other Service Providers

    App\Providers\TwitterServiceProvider::class,
],

これで、サービスプロバイダの登録が終わったので、Laravelの各場所からヘルパー関数resolveを用いて、以下のように記述することでTwitterOAuthクラスのインスタンスが呼べます。

$instance = resolve('twitter');

ファサードの作成

このままでもインスタンスが呼べるので利用上問題はないですが、より簡単に利用するために、サービスコンテナで利用可能なクラスへの静的なインターフェースを提供してくれる、ファサードを利用します。

app/Facades/Twitter.phpへ、以下のファイルを作成します。

<?php

namespace App\Facades;

use Illuminate\Support\Facades\Facade;

class Twitter extends Facade
{
    /**
     * Get the registered name of the component.
     *
     * @return string
     */
    protected static function getFacadeAccessor()
    {
        return 'twitter';
    }
}

getFacadeAccessorメソッドで、サービスコンテナに登録した名称'twitter'を返すようにします。

これで、以下のように、このファサードがTwitterOAuthのメソッドを静的に提供してくれるようになります。

// フォロワーのID一覧を取得する
$result = \App\Facades\Twitter::get('followers/ids');

エイリアスの設定

\App\Facades\Twitterじゃ長いじゃねえか!ということで、エイリアスを使って短くします。

config/app.phpへエイリアスの設定を追加します。

'aliases' => [
    // Other Aliases

    'Twitter' => App\Facades\Twitter::class,
],

これで、以下のようにアクセスできるようになりました。

// フォロワーのID一覧を取得する
$result = \Twitter::get('followers/ids');

なお、エイリアスはグローバル名前空間に定義されているので、namespace宣言されていない場所では、\Twitterの先頭のバックスラッシュは不要です。

まとめ

TwitterOAuthクラスをLaravel 5で利用しやすいように導入してみました。

他の一般的なクラスでも同じように登録できると思いますので、この記事を参考に、色々なクラスを使いやすいように導入してみてください。設定ファイルなどのLaravelの仕組みと統合させることで、直接呼び出して使うよりも便利でわかりやすくなることも多いと思います。