Я смотрел видеокурс laravel, в нем было продемонстрировано использование служебного контейнера в web.php (просто в качестве примера), а в web.php он работает без проблем:
interface KekInterface {};
class Kek implements KekInterface {};
app()->bind('KekInterface', function() {
return new Kek;
});
Route::get('/', function(KekInterface $kekat) {
dd($kekat);
});
Я решил перенести весь свой код на контроллер (класс контроллера):
public function index(KekInterface $api)
{
dd($api);
}
Интерфейс и класс:
interface KekInterface {};
class Kek implements KekInterface {};
app()->bind('KekInterface', function() {
return new Kek;
});
А потом ларавел взвизгнул:
Target [App\Http\Controllers\KekInterface] is not instantiable.
Я не знаю, что вызывает проблему, но думаю, это просто пространства имен






Это потому, что привязка должна выполняться внутри поставщик услуг.
Поместите часть кода app()->bind(...) в метод register класса App\Providers\AppServiceProvider:
/**
* Register any application services.
*
* @return void
*/
public function register()
{
app()->bind(\Full\Namespace\To\KekInterface::class, function() {
return new \Full\Namespace\To\Kek();
})
}
Обратите внимание, что KekInterface и Kek должны находиться внутри разных файлов, названных по имени класса, внутри правой папки в соответствии с нужным пространством имен.
См. Laravel Service Container docs для лучшего понимания.
Он работает с web.php, потому что маршруты вызываются внутри ServiceProvider (RouteServiceProvider). :-)
А как насчет привязки?
Если он работает с интерфейсами, почему он не работает с классами? но думаю это тема для нового вопроса :)
Не уверен в этом. :-(
Сработало, хотя мне кажется странным, что он работает и в web.php? Кстати, говоря о поставщиках услуг, если я передаю первый аргумент (имя класса) методу привязки (singleton и т. д.), Но передаю другой класс в качестве второго аргумента, например:
$this->app->bind('App\Billing\Stripe', function(){return new Kek})laravel выдаст ошибку, и я думаю, что это странно как-то. Потому что, как я думал, прежде чем метод регистрирует классы в контейнере, но пришел к выводу, что он просто редактирует существующие классы, которые были автоматически разрешены. Так ли это на самом деле работает?