我对php/Laravel非常陌生。下面是设置:
在我的项目中,有一个名为RoutesNotifications.php的特性。我认为这是一个Laravel特性,因为它位于供应商\laravel文件夹下。
在这个特性中,有一个函数如下所示:
public function notify($instance)
{
app(Dispatcher::class)->send($this, $instance);
}我已经找到了Dispatcher,它是一个接口。这也是在供应商\ laravel文件夹下的子目录中列出的,所以我假设这也是laravel代码。
我的问题是,我不知道接下来的代码是什么。Dispatcher是一个接口,是定义send签名的地方,但是我如何确定在运行send($this, $instance)时在哪里执行代码呢?
发布于 2019-08-21 20:02:26
app是一个服务容器实例。
调用app为参数传递Illuminate\Contracts\Notifications\Dispatcher接口时,服务容器将解析服务容器中的实现绑定到该接口。
Illuminate\Notifications\NotificationServiceProvider::register负责设置接口的实现。
最后,app(Illuminate\Contracts\Notifications\Dispatcher::class)解析为Illuminate\Notifications\ChannelManager的一个实例。
发布于 2019-08-21 20:02:47
app(Dispatcher::class)返回在laravel Service Container中注册的类的一个实例。
这个类应该实现Dispatcher接口,当其他类需要Dispatcher时,laravel应用程序返回当前在Service Container中注册的实现。
例如,您可以打开修补程序REPL,php artisan tinker,并输入这个命令app(Illuminate\Contracts\Notifications\Dispatcher::class),您将看到作为回报,您有一个Illuminate\Notifications\ChannelManager实例。
也就是说,当某个类需要一个Dispatcher时,laravel service container会小心地返回该Dispatcher的当前注册实现。
您可以在正式文件中阅读关于服务容器的更多信息。
https://stackoverflow.com/questions/57598191
复制相似问题