不确定Laravel在接口实现方面做了什么



我对php/Laravel真的很陌生。这是设置:

在我的项目中,有一个特征叫做RoutesNotifications.php.我认为这是一个Laravel特征,因为它位于供应商\Laravel文件夹下。

在这个特征中,有一个看起来像这样的函数:

public function notify($instance)
{
app(Dispatcher::class)->send($this, $instance);
}

我已经找到了Dispatcher,它是一个界面。这也列在供应商\拉拉维尔文件夹下的子目录中,所以我假设这也是拉拉维尔代码。

我的问题是我不知道代码在此之后的去向。Dispatcher接口是定义send签名的地方,但是我如何确定运行send($this, $instance)时执行的代码在哪里?

app是一个服务容器实例。

调用app将其传递到参数的接口IlluminateContractsNotificationsDispatcher,使服务容器解析服务容器中绑定到该接口的实现。

IlluminateNotificationsNotificationServiceProvider::register负责设置接口的实现。

最后,app(IlluminateContractsNotificationsDispatcher::class)解析为IlluminateNotificationsChannelManager的实例。

https://github.com/laravel/framework/blob/v5.8.33/src/Illuminate/Notifications/NotificationServiceProvider.php#L39

app(Dispatcher::class)返回在 laravelService Container中注册的类的实例。

此类应该实现调度程序接口,当其他类需要Dispatcher时,laravel应用程序返回当前在Service Container中注册的实现。

例如,您可以打开修补器REPLphp artisan tinker并输入此命令app(IlluminateContractsNotificationsDispatcher::class)您将看到返回的IlluminateNotificationsChannelManager实例。

那是当某个类需要Dispatcher时,laravelservice container会注意返回该Dispatcher的当前注册实现。

您可以在官方文档中阅读有关服务容器的更多信息。

最新更新