Blade @inject создает новый экземпляр Singleton

У меня есть 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

это что-то вроде View Composer?

kenken9999 11.07.2018 12:06

@ kenken9999 Я не понимаю. @inject - это директива Laravel по умолчанию laravel.com/docs/5.6/blade#service-injection Я не использую View composer

Arxeiss 11.07.2018 20:27
Стоит ли изучать 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
2
294
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вам нужно удалить начальную косую черту из имени этого класса.

'\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'); ?>

Arxeiss 13.07.2018 08:47

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