Привязка интерфейса к построенному конкретному классу в поставщике услуг Laravel5

У меня есть интерфейс, который я хотел бы привязать к конкретному классу. Дело в том, что конкретный класс требует некоторых элементов конфигурации при создании экземпляра. Вот что я сделал:

...

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

но если я сделаю это таким образом, я не смогу ввести учетные данные.

Что мне здесь не хватает?


person Chris Schmitz    schedule 06.08.2015    source источник


Ответы (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, вместо этого вы получите экземпляр связанного класса.

person Martin Bean    schedule 06.08.2015
comment
Так что это сработало до привязки к моему конкретному классу (спасибо), но теперь я сталкиваюсь с ошибкой UnexpectedValueException in Response.php line 403: The Response content must be a string or object implementing __toString(), "object" given. Это происходит после создания конкретного объекта. Любые быстрые идеи или мне следует отправить для этого другой вопрос о стеке? - person Chris Schmitz; 06.08.2015
comment
@ChrisSchmitz Другая проблема — другой вопрос :) - person Martin Bean; 06.08.2015
comment
[Уже сделано](stackoverflow.com/questions/31862339/) :) - person Chris Schmitz; 06.08.2015