我对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
中注册的实现。
例如,您可以打开修补器REPL、php artisan tinker
并输入此命令app(IlluminateContractsNotificationsDispatcher::class)
您将看到返回的IlluminateNotificationsChannelManager
实例。
那是当某个类需要Dispatcher
时,laravelservice container
会注意返回该Dispatcher
的当前注册实现。
您可以在官方文档中阅读有关服务容器的更多信息。