我有一个自定义类App/Http/Responder
,它有一些方法可以在我的应用程序中构建特定的JSON响应。我想单独测试我的控制器,所以我试图通过构造函数注入我的依赖项。
我的计划是简单地创建一个服务提供商,将其绑定到$app
然后根据文档自动解决:
public function register()
{
$this->app->bind('responder', function()
{
return new App\Http\Responder($this->app['cache'], $this->app['app'], new JsonResponse, $this->app['config']);
});
}
然后我将其添加到我的config/app.php
。
好的,现在我的响应者和它的依赖关系被绑定到应用程序,responder
。
现在我以为我能够将Responder
注入到我的控制器构造函数中,Laravel将能够从IoC容器中自动解析它:
class AreasController extends BaseController {
protected $responder;
public function __construct(Responder $responder)
{
$this->responder = $responder;
}
但是我得到Class Responser does not exist
。
我可以在不使用App::make()
Facade的情况下让它工作的唯一方法是将应用程序注入我的控制器:
use Illuminate\Foundation\Application as App;
class AreasController extends BaseController {
protected $app;
public function __construct(App $app)
{
$this->app = $app;
}
然后我可以$this->app['responder']->method()
。
显然我错过了一些东西,但我想在我的应用程序中远离使用Facades,以便我可以测试。
答案 0 :(得分:4)
如果要在IOC容器中键入要解析的提示类,则应将实际的类名与命名空间绑定:
$this->app->bind('App\Http\Responder', function()
{
return new App\Http\Responder($this->app['cache'], $this->app['app'], new JsonResponse, $this->app['config']);
});
从技术上讲,容器仍然可以解析这个类,因为它是一个可以找到的具体类,但是你所做的方式允许注入其他IOC绑定资源,这是一个很好的做法。 / p>
然后,当您希望为您注入此类时,请像往常一样键入提示类的完整路径:
use App\Http\Responder;
class AreasController extends BaseController {
protected $responder;
public function __construct(Responder $responder)
{
$this->responder = $responder;
}
}
此外,对于它的价值,您的错误表明您拼错了#34; Responder" as"响应者"。