フレームワークにL4用に特別に設計されていないパッケージを含めることはできますか?もしそうなら、それはどのように行われますか?パッケージをvendor
フォルダーに追加するcomposer.json
に追加する必要があることは知っていますが、providers
配列に何らかの方法で登録できますか?他に必要な手順はありますか?
Google checkout package 元々Yii向けに設計されたものを使用したい
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
_
ただし、use
statementを使用して、プログラムでどの(外部)クラス/パッケージが使用されているかを他の開発者(および将来の自分)に明確にすることをお勧めします。
シナリオ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!
_
追加 "tvr/googlecheckout": "dev-master"
これをあなたのcomposer.json
。
実行composer install
、IoCコンテナを使用できます。 Laravel 4:4: http://four.laravel.com/docs/ioc#basic-usage の公式ドキュメントにいくつかのコード例があります。