5

在我的 Laravel 5 应用程序中,我已经为服务提供者中的接口注册了一个上下文绑定,如下所示:

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

在控制器内部MyController,我有index()我试图注入的方法,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'
);

我注意到的另一件事是,对于控制器的构造函数方法,相同的上下文绑定可以正常工作,如下所示:

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

L5 仍是 WIP,此问题尚未解决。

https://github.com/laravel/framework/issues/6177

于 2014-12-26T08:05:18.337 回答
0

这最终在 Laravel 5 (illuminate/container 5.0) 中实现,如问题 #6177中所述。

于 2015-02-07T08:12:17.287 回答