У меня есть BreadcrumbService, который зарегистрирован как Singleton в AppServiceProvider.
public $singletons = [
BreadcrumbService::class => BreadcrumbService::class,
];
Когда я вставляю его в свой контроллер с помощью метода __construct, все работает отлично. Я заполняю панировочные сухари в действии контроллера и возвращаю представление. Но с учетом того, что если я использую директиву @inject, она создает новое событие экземпляра, которое регистрируется как синглтон.
@inject('breadcrumbs', '\SunApp\Services\BreadcrumbService')
@php
var_dump(resolve(\SunApp\Services\BreadcrumbService::class)->isActive());
var_dump($breadcrumbs->isActive());
@endphp
Первый var_dump распечатывает true, второй false. Это ошибка или я что-то упустил в поведении @inject
@ kenken9999 Я не понимаю. @inject - это директива Laravel по умолчанию laravel.com/docs/5.6/blade#service-injection Я не использую View composer






Вам нужно удалить начальную косую черту из имени этого класса.
'\Something\Else' != 'Something\Else'
Без косой черты нахождение привязки. С косой чертой это не так, поскольку имя не совпадает, поэтому new просто создает новый экземпляр. PHP требует, чтобы вы использовали полное имя класса, если вы хотите вызвать new со строкой, когда класс все равно находится в пространстве имен.
Вывод: нет проблем с @inject, так как он вызывает только app($service). Именно так контейнер приложения ищет привязки. Эти привязки представляют собой строки, которые просто иногда являются FQCN, они могут быть просто любыми случайными строками.
Вы правы, моя ошибка. Я думал, что сервисный контейнер работает иначе. Но по поводу вашей первой строчки: «Скорее всего, лучше было бы использовать константу класса». Если я поставлю этот @inject('breadcrumbService', SunApp\Services\BreadcrumbService::class), он не сработает. Blade процитирует второй параметр, это из скомпилированного шаблона: <?php $breadcrumbService = app('SunApp\Services\BreadcrumbService::class'); ?>
это что-то вроде View Composer?