当绑定由Laravel中的提供程序完成时,使用App :: make的依赖性解析不起作用

时间:2017-05-24 04:32:03

标签: laravel laravel-5.2

我正在使用Laravel 5.2。我尝试从IOCContainer中解决Laravel中的依赖关系,如下所示。(使用App::make方法)

App/FooController.php:-

<?php

namespace App\Http\Controllers;

use App\Bind\FooInterface;
use Illuminate\Support\Facades\App;

class FooController extends Controller
{
    public  function outOfContainer(){
        dd(App::make('\App\bind\FooInterface')); // Focus: program dies here!!
    }
}

在AppServiceProvider中完成FooInterface的绑定,如下所示

App/Providers/AppServiceProvider.php:-

<?php

namespace App\Providers;

use App\Bind\Foo;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->bind('\App\Bind\FooInterface', function() {
            return new Foo();
        });
    }
}

Foo类的结构如下。

App/Bind/Foo.php:-

<?php

namespace App\Bind;


class Foo implements FooInterface {

} 

FooInterface接口的结构如下: -

<?php

namespace App\Bind;


interface FooInterface {

}

然后我按如下方式创建了一条路线。

Route::get('/outofcontainer', 'FooController@outOfContainer');

但是当我导航到这条路线时,它会抛出一个带有错误文本的异常:

BindingResolutionException in Container.php line 748:
Target [App\bind\FooInterface] is not instantiable.

这有什么问题? 如何在AppServiceProvider中使用App:make()?

1 个答案:

答案 0 :(得分:0)

在您的服务提供商中,您将绑定字符串'\App\Bind\FooInterface'。在您的控制器中,您尝试制作字符串'\App\bind\FooInterface'。这些字符串不一样,因为它们有不同的情况(Bind vs bind)。由于字符串不相同,Laravel无法在容器中找到绑定。

更正make语句中的大小写,它应该有效:

dd(App::make('\App\Bind\FooInterface'));