服务提供器是所有 Laravel 应用程序引导中心。你的应用程序自定义的服务、第三方资源包提供的服务以及 Laravel 的所有核心服务都是通过服务提供器进行注册(register)和引导(boot)的。

拿一个Laravel框架自带的服务提供器来举例子

class BroadcastServiceProvider extends ServiceProvider
{protected $defer = true;public function register(){$this->app->singleton(BroadcastManager::class, function ($app) {return new BroadcastManager($app);});$this->app->singleton(BroadcasterContract::class, function ($app) {return $app->make(BroadcastManager::class)->connection();});//将BroadcastingFactory::class设置为BroadcastManager::class的别名$this->app->alias(BroadcastManager::class, BroadcastingFactory::class);}public function provides(){return [BroadcastManager::class,BroadcastingFactory::class,BroadcasterContract::class,];}
}

在服务提供器BroadcastServiceProviderregister中, 为BroadcastingFactory的类名绑定了类实现BroadcastManager,这样就能通过服务容器来make出通过BroadcastingFactory::class绑定的服务BroadcastManger对象供应用程序使用了。

首先laravel注册和引导应用需要的服务是发生在寻找路由处理客户端请求之前的Bootstrap阶段的,在框架的入口文件里我们可以看到,框架在实例化了Application对象后从服务容器中解析出了HTTP Kernel对象

$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);$response = $kernel->handle($request = Illuminate\Http\Request::capture()
);

在Kernel处理请求时会先让请求通过中间件然后在发送请求给路由对应的控制器方法, 在这之前有一个BootStrap阶段通过执行下面列出的框架预定义脚手架的bootstrap方法来引导启动应用程序的各个部分从而完成Laravel应用程序的引导

1. DetectEnvironment  检查环境
2. LoadConfiguration  加载应用配置
3. ConfigureLogging   配置日至
4. HandleException    注册异常处理的Handler
5. RegisterFacades    注册Facades
6. RegisterProviders  注册Providers
7. BootProviders      启动Providers
namespace Illuminate\Foundation;class Application extends Container implements ...
{public function bootstrapWith(array $bootstrappers){$this->hasBeenBootstrapped = true;foreach ($bootstrappers as $bootstrapper) {$this['events']->fire('bootstrapping: '.$bootstrapper, [$this]);$this->make($bootstrapper)->bootstrap($this);$this['events']->fire('bootstrapped: '.$bootstrapper, [$this]);}}
}

再第6和第7个框架的引导程序中会进行服务提供其的注册和初始化,关于注册又分为即时注册和延迟注册,延迟注册让我们在真正需要解析服务前或者时某个事件发生后再来执行服务提供器的注册方法,避免在框架一开始阶段就注册大量某些场景才会用到的服务浪费资源和时间。
如果我们想使用服务容器解析自己定义或者第三方软件包的服务就需要通过服务提供器里使用服务容器的singleton、bind、alias方法注册到服务容器中去,这样才能用服务容器make解析出服务或者时直接用门面来访问服务里提供的方法。
大家可以点击“阅读原文” 阅读关于Laravel服务提供器的源码分析。

Laravel服务提供器相关推荐

  1. Laravel核心解读--服务提供器(ServiceProvider)

    服务提供器是所有 Laravel 应用程序引导中心.你的应用程序自定义的服务.第三方资源包提供的服务以及 Laravel 的所有核心服务都是通过服务提供器进行注册(register)和引导(boot) ...

  2. SuperSocket 服务管理器 (ServerManager)

    SuperSocket SuperSocket 服务管理器 (ServerManager) 中文(中国)Toggle Dropdown 关键字: ServerManager, 服务管理器, 管理, 管 ...

  3. 模型-视图-提供器 模式

    原文:http://www.tracefact.net/Software-design/Model-View-Presenter-Pattern.aspx 出处:http://msdn.microso ...

  4. Megastore:为交互式服务提供可扩展的高可用性存储

    目录 1 简介 2 以可用性和规模为目标 3 A TOUR OF Megastore 4 复制 5 经验 6 相关工作 7 结论 Megastore:为交互式服务提供可扩展的高可用性存储 摘要:Meg ...

  5. 约三分之二的 DDoS 攻击指向通信服务提供商

    百度智能云 云生态狂欢季 热门云产品1折起>>>   据网络安全公司 Nexusguard 2018年第三季度的 DDoS 威胁报告,该季度有66.5%的 DDoS 攻击指向通信服务 ...

  6. [译]模型-视图-提供器 模式

    模型-视图-提供器 模式 出处:http://msdn.microsoft.com/en-us/magazine/cc188690.aspx 引言 随着像Asp.Net和Windows窗体这样的用户界 ...

  7. java spi_Java SPI(服务提供商接口)和ServiceLoader

    java spi Java SPI (Service Provider Interface) is the mechanism to load services dynamically. We can ...

  8. 征途服务管理器显示不出启动服务器,征途服务器管理器连接数据库

    征途服务器管理器连接数据库 内容精选 换一换 本章介绍如何在管理控制台购买GaussDB(for openGauss)实例,并通过内网使用弹性云服务器连接GaussDB(for openGauss)实 ...

  9. Spamhaus -影响最大的RBL(实时黑名单列表)服务提供商,非营利性组织

    Spamhaus网址 http://www.spamhaus.org .只要被它列入黑名单,你的邮件服务器就算瘫痪了,因为据说全球80%以上的服务器会拒收从你的邮件服务器发去邮件. 它有三种类型:XB ...

最新文章

  1. redis添加认证密码
  2. redis的bitset实战
  3. 小工匠聊架构-分布式场景下的并发幂等性常见的解决方案
  4. cad怎么设置线的粗细_CAD软件中怎么设置CAD线宽?
  5. Linux系统CPU相关信息查询
  6. 自动驾驶面试题汇总(2022秋招题库)——持续更新
  7. 计算机网络安全常见问题,计算机网络安全是指什么?
  8. python从入门到放弃-《Python3从入门到放弃》视频教程
  9. VC++ 只运行一个程序实例
  10. echarts地图示例
  11. Excel文件解密软件
  12. 微积分:2.2泰勒公式函数极值定积分
  13. RGB色彩空间转CMYK色彩空间
  14. tft液晶屏接口概述及信号类型
  15. 真假内推?直拿offer?别被无良中介给骗了
  16. 苏宁易购,淘宝网,京东商城,百万级价格数据海量抓取
  17. 帘卷秋声,雁过寒楼。落烟华,满清秋。浣一溪瘦月
  18. linux字符串加引号,请问 命令行中写路径,加引号和不加有什么区别?
  19. OGV格式转成MP4格式
  20. 鸥玛软件在深交所创业板挂牌上市,系山东大学间接控股企业

热门文章

  1. 《为iPad而设计:打造畅销App》——快速回顾用户界面设计史
  2. Educational Codeforces Round 20 B. Distances to Zero
  3. 别傻了,人家离职你也离
  4. 虚拟寄存器,虚拟堆栈与真实寄存器,真实堆栈如何对应
  5. Kafka Consumer端的一些解惑
  6. 用 TigerVNC 实现 Linux 远程桌面
  7. 构建虚拟工控环境系列 - 罗克韦尔虚拟PLC
  8. Eclipse StartExplorer插件
  9. Quartz 2 定时任务(一):基本使用指南
  10. swift -- Tuple 元组 Dictionary