Laravel ServiceProvicder为什么有人会为同一个班级注册2个单身人士?

时间:2018-02-08 14:02:29

标签: php laravel dependency-injection

我希望从Laravel 4.2到5.5重构现有代码。原始程序员对他们所有的ServiceProviders都有类似的东西:

use App\UI\Alerts;
class AlertsProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->singleton('Alerts', function ($app) {
            return new Alerts;
        });

        $this->app->singleton('App\UI\Alerts', function ($app) {
            return $app->make('Alerts');
        });
    }
}

第二个单身人士的目的是什么?需要吗?

注意......我的背景不是PHP。

2 个答案:

答案 0 :(得分:1)

Laravel在提供程序中使用$this->app->singleton()将字符串别名化为实现,最常见的是将接口映射到具体对象。这两个陈述不同,因为'Alerts''App\UI\Alerts'的值不同。

$this->app->singleton('Alerts', function ($app) {
    return new Alerts;
});

允许你这样做

$alerts = app('Alerts');

尽管

$this->app->singleton('App\UI\Alerts', function ($app) {
    return $app->make('Alerts');
});

允许您这样做

$alerts = app('App\UI\Alerts');

对于完整的类路径,这通常也与::class结合使用。

use App\UI\Alerts;
$alerts = app(Alerts::class);

答案 1 :(得分:0)

我看到的是那些警报是2个不同的类,因为它们的命名空间不匹配,所以我建议你仔细看看它们两个并查看它们之间的区别。