Проблема с сервисным контейнером

Я смотрел видеокурс 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.

Я не знаю, что вызывает проблему, но думаю, это просто пространства имен

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это потому, что привязка должна выполняться внутри поставщик услуг.

Поместите часть кода 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? Кстати, говоря о поставщиках услуг, если я передаю первый аргумент (имя класса) методу привязки (singleton и т. д.), Но передаю другой класс в качестве второго аргумента, например: $this->app->bind('App\Billing\Stripe', function(){return new Kek}) laravel выдаст ошибку, и я думаю, что это странно как-то. Потому что, как я думал, прежде чем метод регистрирует классы в контейнере, но пришел к выводу, что он просто редактирует существующие классы, которые были автоматически разрешены. Так ли это на самом деле работает?

Artshellorok 26.10.2018 16:17

Он работает с web.php, потому что маршруты вызываются внутри ServiceProvider (RouteServiceProvider). :-)

Elias Soares 26.10.2018 16:20

А как насчет привязки?

Artshellorok 26.10.2018 16:24

Если он работает с интерфейсами, почему он не работает с классами? но думаю это тема для нового вопроса :)

Artshellorok 26.10.2018 16:35

Не уверен в этом. :-(

Elias Soares 26.10.2018 16:36

Другие вопросы по теме