服务容器问题

时间:2018-10-26 13:48:17

标签: php laravel

我观看了一个laravel视频课程,其中在web.php(仅作为示例)中演示了服务容器的用法,并且在web.php中它没有任何问题:

interface KekInterface {};
class Kek implements KekInterface {};
app()->bind('KekInterface', function() { 
    return new Kek;    
});
Route::get('/', function(KekInterface $kekat) {
    dd($kekat);
});

我决定将所有代码移至控制器(controller class):

public function index(KekInterface $api)
{
    dd($api);
}

接口和类:

interface KekInterface {};
class Kek implements KekInterface {};
app()->bind('KekInterface', function() { 
    return new Kek;    
});

然后laravel哼了一声:

  

目标[App \ Http \ Controllers \ KekInterface]无法实例化。

我不知道是什么原因引起的,但是我想那只是命名空间

1 个答案:

答案 0 :(得分:0)

那是因为绑定必须在service provider内部运行。

将代码的app()->bind(...)部分放在register类的App\Providers\AppServiceProvider方法内:

/**
 * Register any application services.
 *
 * @return void
 */
public function register()
{
    app()->bind(\Full\Namespace\To\KekInterface::class, function() {
        return new \Full\Namespace\To\Kek();
    })
}

请注意,KekInterfaceKek必须位于不同的文件中(由类名命名),并根据所需的命名空间位于正确的文件夹中。

请参阅Laravel Service Container docs,以更好地理解。