Laravel没有在控制器中找到IoC绑定

时间:2014-10-29 18:41:58

标签: php laravel laravel-4

我有一个自定义类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,以便我可以测试。

1 个答案:

答案 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"响应者"。