У меня есть интерфейс, который я хотел бы привязать к конкретному классу. Дело в том, что конкретному классу требуются некоторые элементы конфигурации при создании экземпляра. Вот что я сделал:
...
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'));
});
}
}
Я хватаю нужные мне элементы конфигурации, а затем передаю недавно созданный конкретный класс.
Проблема в том, когда я пытаюсь внедрить интерфейс в свой контроллер dev, чтобы проверить его:
...
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');
}
но если я делаю это таким образом, я не могу ввести учетные данные.
Что мне здесь не хватает?
Вы привязываете конкретный класс к 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
вместо этого вы получите экземпляр связанного класса.
Других решений пока нет …