L4 専用に設計されていないパッケージをフレームワークに含めることはできますか? もしそうなら、それはどのように行われますか?パッケージをフォルダーに追加するパッケージを my に追加する必要があることはわかってcomposer.json
いvendor
ますが、どうにかしてproviders
配列に登録できますか? 他に必要な手順はありますか?
Yii 用に設計されたGoogle チェックアウト パッケージを使用したい
L4 専用に設計されていないパッケージをフレームワークに含めることはできますか? もしそうなら、それはどのように行われますか?パッケージをフォルダーに追加するパッケージを my に追加する必要があることはわかってcomposer.json
いvendor
ますが、どうにかしてproviders
配列に登録できますか? 他に必要な手順はありますか?
Yii 用に設計されたGoogle チェックアウト パッケージを使用したい
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!
これを に追加"tvr/googlecheckout": "dev-master"
しますcomposer.json
。
を実行composer install
すると、IoC コンテナーを使用できます。いくつかのコード例は、Laravel 4 の公式ドキュメントにあります: http://four.laravel.com/docs/ioc#basic-usage