我有一个接口,我想绑定到一个具体的类。问题是,具体类在实例化时需要一些配置项。这是我做的:
...
class FileMakerServiceProvider extends ServiceProvider
{
public function boot()
{
//
}
public function register()
{
$this->app->bind('FileMakerInterface', function ($app){
$username = env('FM_USERNAME');
$password = env('FM_PASSWORD');
$host = env('FM_HOST');
$database = env('FM_DATABASE');
return new SSCSimpleFm(compact('username', 'password', 'host', 'database'));
});
}
}
我正在抓取我需要的配置项,然后传入一个新构造的具体类。
问题是当我尝试将接口注入我的开发控制器以测试它时:
...
use App\Services\FileMakerInterface;
class DevController extends Controller
{
public function testFmConnect(FileMakerInterface $fm){
return $fm;
}
}
我得到接口不可实例化的错误:
我确实在config/app.php
中包含了我的服务提供商:
/*
* Application Service Providers...
*/
App\Providers\AppServiceProvider::class,
App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class,
App\Providers\FileMakerServiceProvider::class
我知道可以绑定我的服务提供者中的类,如下所示:
public function register()
{
$this->app->bind('FileMakerInterface', 'SSCSimpleFm');
}
但如果我这样做,我就无法注入凭据。
我在这里缺少什么?
答案 0 :(得分:1)
您只将具体类绑定到FileMakerInterface
。它需要一个完全限定的命名空间:
$this->app->bind('App\Services\FileMakerInterface', function ($app) {
return new SSCSimpleFm([
'host' => env('FM_HOST'),
'username' => env('FM_USERNAME'),
'password' => env('FM_PASSWORD'),
'database' => env('FM_DATABASE'),
]);
}
现在,当你输入提示App\Services\FileMakerInterface
时,你会得到一个绑定类的实例。