5

Laravel 5 アプリケーション内で、次のようにサービス プロバイダーのインターフェイスのコンテキスト バインディングを登録しました。

$this->app->when('App\Http\Controllers\MyController')
    ->needs('App\Contracts\MyRepositoryInterface')
    ->give('App\Repositories\MyRepostory');

controller の内部には、次のように挿入しようとしているメソッドがありますMyControllerindex()MyRepositoryInterface

public function index(App\Contracts\MyRepositoryInterface $repo)
{
    // Stuff
}

問題は、上記が機能せず、次のエラーが発生することです。

Container.php 行 754 の BindingResolutionException:

ターゲット [App\Contracts\MyRepositoryInterface] はインスタンス化できません。

ただし、コンテキスト バインディングを次のような通常のバインディングに変更すると、機能します。

$this->app->bind(
    'App\Contracts\MyRepositoryInterface',
    'App\Repositories\MyRepository'
);

私が気付いたもう 1 つのことは、次のように、コントローラーのコンストラクター メソッドに対して同じコンテキスト バインディングが正常に機能することです。

public function __constructor(App\Contracts\MyRepositoryInterface $repo)
{
    // Stuff
}

メソッド (コンストラクターを除く) のインジェクションでは、コンテキスト バインディングはサポートされていないのでしょうか。それとも、これはまだ進行中の作業であり、Laravel 5 がリリースされたらサポートされる予定ですか?

それとも、私は何かひどく間違ったことをしていますか?

私はこれについて髪を引っ張っているので、どんなアドバイスも大歓迎です!

4

3 に答える 3

1

メソッドで動作することを意図していないため、Laravel 5 はこれをサポートしていません。回避策は、次のように ValidatesWhenResolved インターフェースを独自のもので拡張することです。

namespace Authentication\Requests\Contracts;
use Illuminate\Contracts\Validation\ValidatesWhenResolved;

interface Validatable extends ValidatesWhenResolved {}

そして、そのインターフェースにバインドできるよりも:

$this->app->bind('Authentication\Requests\Contracts\Validatable',
'Authentication\Requests\Login');

DRYではありませんが。

于 2015-10-01T12:32:10.597 に答える
0

issue #6177で説明されているように、これは最終的に Laravel 5 (illuminate/container 5.0) で実装されました。

于 2015-02-07T08:12:17.287 に答える