我有BreadcrumbService,它已在AppServiceProvider中注册为Singleton
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
答案 0 :(得分:2)
您需要从该类名中删除起始斜杠。
'\Something\Else' != 'Something\Else'
不使用斜杠即可找到绑定。斜杠不存在,因为名称不匹配,因此仅new
结束了一个新实例。如果您想在类位于命名空间中时使用字符串调用new
,则PHP要求您使用类的全限定名。
结论:@inject
没有问题,因为它仅调用app($service)
。这就是Application容器查找绑定的方式。这些绑定是字符串,有时恰好是FQCN,它们可以是任何随机字符串。