Blade @inject创建新的Singleton实例

时间:2018-07-11 09:35:22

标签: php laravel laravel-blade

我有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

的行为

1 个答案:

答案 0 :(得分:2)

您需要从该类名中删除起始斜杠。

'\Something\Else' != 'Something\Else'

不使用斜杠即可找到绑定。斜杠不存在,因为名称不匹配,因此仅new结束了一个新实例。如果您想在类位于命名空间中时使用字符串调用new,则PHP要求您使用类的全限定名。

结论:@inject没有问题,因为它仅调用app($service)。这就是Application容器查找绑定的方式。这些绑定是字符串,有时恰好是FQCN,它们可以是任何随机字符串。