44

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

Yii 用に設計されたGoogle チェックアウト パッケージを使用したい

4

2 に答える 2

100

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

開発者が 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 ...

したがって、この問題を修正する必要があります。これを行うには、instagram の composer.json を調べることができます。これは、facebook の php SDK とは異なるオートロードを備えています。

"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

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

シナリオ 3

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

速くて汚い

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

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

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

App::make('Instaphp');

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

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

ステップ1:

アプリ フォルダー内にフォルダーを作成します (たとえば、'providers' フォルダー)。

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(). これが良い習慣だと言っているのではなく、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!
于 2013-03-05T13:36:22.257 に答える
1

これを に追加"tvr/googlecheckout": "dev-master"しますcomposer.json

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

于 2013-03-03T21:07:01.093 に答える