web-dev-qa-db-ja.com

Laravel 4で非laravelパッケージを使用する

フレームワークにL4用に特別に設計されていないパッケージを含めることはできますか?もしそうなら、それはどのように行われますか?パッケージをvendorフォルダーに追加するcomposer.jsonに追加する必要があることは知っていますが、providers配列に何らかの方法で登録できますか?他に必要な手順はありますか?

Google checkout package 元々Yii向けに設計されたものを使用したい

43
Matanya

composer 4でのサードパーティLaravelパッケージの使用

開発者がcomposerパッケージを作成するとき、PSR-0またはPSR-4標準を使用して自動ロードをマップする必要があります。そうでない場合は、Laravelアプリケーションにパッケージをロードする際に問題が発生する可能性があります。 PSR-0標準は次のとおりです。

_{
    "autoload": {
        "psr-0": { "Acme": "src/" }
    }
}
_

そして、PSR-4標準:

_{
    "autoload": {
         "psr-4": { "Acme\\": "src/" }
    }
}
_

基本的に、上記は名前空間ファイルを探す場所をcomposerに伝えるための標準です。独自の名前空間を使用していない場合は、他の設定を行う必要はありません。

シナリオ1

LaravelのPSR-0標準以下のパッケージ(自動ロードクラスマップ付き)

これは簡単なもので、たとえば、facebook php sdkを使用します。

https://packagist.org/packages/facebook/php-sdk

ステップ1:

Composer.jsonファイルにパッケージを含めます。

_"require": {
    "laravel/framework": "4.0.*",
    "facebook/php-sdk": "dev-master"
}
_

ステップ2:

_run: composer update
_

ステップ3:

Facebookパッケージはそのまま使用できるクラスマップを使用するため、すぐにパッケージの使用を開始できます。 (以下のコード例は通常のビューから直接来ています。本番アプリのビューからロジックを排除してください。)

_$facebook = new Facebook(array(
    'appId'  => 'secret',
    'secret' => 'secret'
));
var_dump($facebook); // It works!
_

シナリオ2

この例では、Instagram PHP APIのラッパーを使用します。ここで、パッケージをロードするためにいくつかの調整を行う必要があります。やるだけやってみよう!パッケージは次の場所にあります。

https://packagist.org/packages/fishmarket/instaphp

ステップ1:

composer .jsonに追加

_"require": {
    "laravel/framework": "4.0.*",
    "fishmarket/instaphp": "dev-master"
}
_

その後、正常に更新できます(コンポーザーの更新)

次に、facebookパッケージで行ったようにパッケージを使用してみてください。繰り返しますが、これはビュー内の単なるコードです。

_$instagramconfig = array(
    'client_id' => 'secret',
    'client_secret'=> 'secret',
    'access_token' => 'secret'
);

$api = Instaphp::Instance(null, $instagramconfig);                
var_dump($api); // Epic fail!
_

上記の例を試すと、このエラーが発生します:

_FatalErrorException: Error: Class 'Instaphp' not found in ...
_

したがって、この問題を修正する必要があります。これを行うには、facebook php sdkが持っていたものとは異なるautoloadを持つinstagram composer.jsonを調べます。

_"autoload": {
         "psr-0": { "Instaphp": "." }
    }
_

Facebook composer.jsonと比較して:

_"autoload": {
        "classmap": ["src"]
    }
_

(Composerは、ファイルやクラスマップからPSRまで、さまざまな種類のオートロードを処理します。_vendor/composer/_フォルダーを見て、その実行方法を確認してください。)

次に、手動でクラスをロードする必要があります。簡単に、これを追加するだけです(コントローラー、モデル、またはビューの上部):

_use Instaphp\Instaphp;
_

composer dump-autoload、それは動作します!

step2(オプション)

もう1つの方法は(「use」ステートメントを使用したくない場合は、コードから直接ファイルを探すようにcomposerに指示するだけです。インスタンスを次のように変更します。

_// reference the name-spaced class straight in the code
$api = Instaphp\Instaphp::Instance(null, $instagramconfig); 
var_dump($api); // It works
_

ただし、usestatementを使用して、プログラムでどの(外部)クラス/パッケージが使用されているかを他の開発者(および将来の自分)に明確にすることをお勧めします。

シナリオ3

ここでは、IOCコンテナに組み込まれたLaravelsを使用して、サービスプロバイダーを登録します。一部のパッケージは、この方法に適さない場合があることに注意してください。シナリオ2と同じInstagramパッケージを使用します。

迅速で汚れている

デザインパターンとサービスプロバイダーを気にしない場合は、次のようにクラスをバインドできます。

_App::bind('Instaphp', function($app)
{
    return new Instaphp\Instaphp;
});
_

そして、あなたはこのように解決します。

_App::make('Instaphp');
_

クイックでダーティエンド

より大きなプロジェクトに取り組んでおり、インターフェイスを利用する場合は、おそらくバインディングをさらに抽象化する必要があります。

ステップ1:

アプリフォルダー内にフォルダーを作成します(「プロバイダー」フォルダーなど)。

_app/providers
_

Laravelがそのフォルダーを自動ロードすることを確認してください。次のように、composer.jsonに追加情報を渡すことができます。

_"autoload": {

    "classmap": [
        "app/commands",
        "app/controllers",
        "app/models",
        "app/database/migrations",
        "app/database/seeds",
        "app/tests/TestCase.php",
        "app/providers" // this was added
    ]

},
_

次に、Instagram.phpという新しいフォルダー内にファイルを作成し、これを内部に配置します。

_ <?php

    use Illuminate\Support\ServiceProvider;

    class InstagramServiceProvider extends ServiceProvider {

    public function register()
    {
        $this->app->bind('Instaphp', function()
        {
            return new Instaphp\Instaphp;
        });

    }

}
_

composer dump-autoloadを再度実行すると、パッケージを使用できます。 instagramパッケージにはfinal private function __construct()があります。これは、constructメソッドをpublicに変更せずに元のクラスの外部でそのパッケージを使用できないことを意味します。私はこれが良い習慣だと言っているわけではありません。instagramパッケージの場合、シナリオ2を使用することをお勧めします。

とにかく、この後、次のようなパッケージを使用できます。

_$instagramInstance = App::make('Instaphp');

$instagramconfig = array(
    'client_id' => 'secret',
    'client_secret'=> 'secret',
    'access_token' => 'secret'
 );

$instagram = new $instagramInstance();
$userfeed = $instagram->Users->feed($instagramconfig);

var_dump($userfeed); // It works!
_
100
stormpat

追加 "tvr/googlecheckout": "dev-master"これをあなたのcomposer.json

実行composer install、IoCコンテナを使用できます。 Laravel 4:4: http://four.laravel.com/docs/ioc#basic-usage の公式ドキュメントにいくつかのコード例があります。

1
conradkdotcom