我观看了一个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]无法实例化。
我不知道是什么原因引起的,但是我想那只是命名空间
答案 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();
})
}
请注意,KekInterface
和Kek
必须位于不同的文件中(由类名命名),并根据所需的命名空间位于正确的文件夹中。
请参阅Laravel Service Container docs
,以更好地理解。