Несколько вопросов уже задавалось по этой теме, но у меня все еще есть эта проблема, и я понятия не имею, в чем проблема.
Я хочу добиться того, чтобы я мог создать экземпляр интерфейса вместо реализации.
Я использую 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, но чего мне не хватает? Заранее спасибо 🙂
Похоже, вы неправильно написали пространство имен при связывании, использовали App \ Contacts вместо App \ Contracts. Должно быть:
$this->app->bind('App\Contracts\Messenger', 'App\Services\DailyMessenger');
Других решений пока нет …