Laravel 5 IoC 容器在使用方法注入时无法解析上下文绑定

Posted

技术标签:

【中文标题】Laravel 5 IoC 容器在使用方法注入时无法解析上下文绑定【英文标题】:Laravel 5 IoC container unable to resolve contextual bindings when using method injection 【发布时间】:2015-01-21 20:46:49 【问题描述】:

在我的 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] 不可实例化。

但是,如果我将 contextual binding 更改为正常的 binding,如下所示,它可以工作:

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

我注意到的另一件事是,相同的 上下文绑定 可以很好地用于控制器的构造方法,如下所示:

public function __constructor(App\Contracts\MyRepositoryInterface $repo)

    // Stuff

这让我想知道,方法(构造函数除外)注入是否不支持上下文绑定?或者这仍然是一项正在进行的工作,一旦 Laravel 5 出来就会得到支持?

还是我做错了什么?

任何建议都将不胜感激,因为我一直在努力解决这个问题!

【问题讨论】:

【参考方案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。

【讨论】:

我的回答是基于 laravel 5 表单请求。但是你可以扩展任何你喜欢的接口。【参考方案2】:

L5 仍处于 WIP 阶段,此问题尚未解决。

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

【讨论】:

感谢您让我知道 - 我已经在那里发表了评论。让我们希望他们解决这个问题!【参考方案3】:

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

【讨论】:

看来情况并非如此。

以上是关于Laravel 5 IoC 容器在使用方法注入时无法解析上下文绑定的主要内容,如果未能解决你的问题,请参考以下文章

Laravel依赖注入(DI)和Ioc容器

laravel服务容器-----深入理解控制反转(IoC)和依赖注入(DI)

译深入研究 Laravel 的依赖注入容器

PHP依赖注入,控制反转,反射Ioc容器和服务提供者各个概念的理解和使用

PHP依赖注入,控制反转,反射Ioc容器和服务提供者各个概念的理解和使用

laravel 服务容器实现原理