2015-04-02 3 views
3

Несколько вопросов уже заданы об этой теме, но у меня все еще есть эта проблема, и у меня нет подсказки о том, в чем проблема.Цель Laravel 5 не является реальностью

Я хочу добиться того, что я могу создать интерфейс вместо реализации.

Я использую Laravel 5, это код/​​структура:

В приложении, я создал папку Contracts. В этой папке у меня есть Messenger.php:

Messenger.php

<?php namespace App\Contracts; 

interface Messenger { 

    public function goodmorning($name); 

} 

В приложение/Услуги у меня есть DailyMessenger.php

<?php namespace App\Services; 

use App\Contracts\Messenger; 

class DailyMessenger implements Messenger { 

    public function goodmorning($name) 
    { 
     return 'Goodmorning '. $name; 
    } 

} 

Теперь я хочу, чтобы создать экземпляр интерфейс в моем контроллере :

public function __construct(Messenger $messenger) 
    { 
     $this->messenger = $messenger; 
    } 

Теперь, если я следовать документации на веб-сайте Laravel я должен только зарегистрировать это в контейнере службы, который я делаю в существующем AppServiceProvider.php

public function register() 
    { 
     $this->app->bind(
      'Illuminate\Contracts\Auth\Registrar', 
      'App\Services\Registrar' 
     ); 

     $this->app->bind('App\Contacts\Messenger', 'App\Services\DailyMessenger'); 
    } 

Если я посещаю соответствующий маршрут, который отображает на контроллер я получаю ошибку:

BindingResolutionException in Container.php line 785: 
Target [App\Contracts\Messenger] is not instantiable. 

Я думаю, что я следовал документы Laravel точно, но что мне не хватает? Заранее спасибо :-)

ответ

3

Похоже, вы неправильно указали пространство имен при связывании, использовали App \ Contacts вместо App \ Contracts. Должно быть:

$this->app->bind('App\Contracts\Messenger', 'App\Services\DailyMessenger'); 
Смежные вопросы