2015-08-06 6 views
0

У меня есть интерфейс, который я хотел бы привязать к конкретному классу. Дело в том, что конкретный класс требует некоторых элементов конфигурации при создании экземпляра. Вот что я сделал:Связывание интерфейса с построенным конкретным классом у поставщика услуг 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; 
    } 
} 

Я получаю ошибку, что интерфейс не является инстанциируемым:

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

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

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

ответ

0

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

+0

Так что это было связано с моим конкретным классом (спасибо), но теперь я столкнулся с ошибкой 'UnexpectedValueException в строке Response.php 403: . Содержимое ответа должно быть строкой или объектом, реализующим __toString(), «объект» задан. «Это происходит после создания конкретного объекта. Любые быстрые идеи, или я должен представить другой вопрос о стеке для него? –

+0

@ChrisSchmitz Разные вопросы, так что разные вопросы :) –

+0

[Уже сделано] (http://stackoverflow.com/questions/31862339/error-the-response-content-must-be-a-string-or-object-implementing- нанизывать) :) –

 Смежные вопросы

  • Нет связанных вопросов^_^