将接口绑定到Laravel5服务提供程序中的构造的具体类

时间:2015-08-06 16:46:45

标签: php laravel-5 service-provider

我有一个接口,我想绑定到一个具体的类。问题是,具体类在实例化时需要一些配置项。这是我做的:

...

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;
    }
}

我得到接口不可实例化的错误:

enter image description here

我确实在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');
}

但如果我这样做,我就无法注入凭据。

我在这里缺少什么?

1 个答案:

答案 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时,你会得到一个绑定类的实例。