版权声明:本文为博主原创文章,未经博主允许不得转载。

register()是在服务容器注册服务,

bootstrap/app.php

/***  注册外部服务*/
$app->register(Dingo\Api\Provider\LumenServiceProvider::class);
$app->register(Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class);
$app->register(Maatwebsite\Excel\ExcelServiceProvider::class);/***   注册内部服务*/
$app->register(App\Providers\User\UserServiceProvider::class);
$app->register(App\Providers\Validate\ValidateServiceProvider::class);
$app->register(App\Providers\Cache\CacheServiceProvider::class);

    /*** Register a service provider with the application.(申请登记服务提供商)** @param  \Illuminate\Support\ServiceProvider|string  $provider* @return \Illuminate\Support\ServiceProvider*/public function register($provider){    if (! $provider instanceof ServiceProvider) {  $provider = new $provider($this);}if (array_key_exists($providerName = get_class($provider), $this->loadedProviders)) {return;}$this->loadedProviders[$providerName] = true;if (method_exists($provider, 'register')) {$provider->register();}if (method_exists($provider, 'boot')) {return $this->call([$provider, 'boot']);}}

如果不是继承ServiceProvider,则直接new一个实例,传过去的$this是$app,那边类初始化时可以接收这个对象,然后操作容器;如果该服务已注册,则直接返回;标记为true;如果有register函数则执行:如果有boot函数,则调用call函数

    /*** Call the given Closure / class@method and inject its dependencies.(调用给定的闭包/类@方法并注入它的依赖项。)** @param  callable|string  $callback* @param  array  $parameters* @param  string|null  $defaultMethod* @return mixed*/public function call($callback, array $parameters = [], $defaultMethod = null){return BoundMethod::call($this, $callback, $parameters, $defaultMethod);}

/*** Call the given Closure / class@method and inject its dependencies.(调用给定的闭包/类@方法并注入它的依赖项。)** @param  \Illuminate\Container\Container  $container* @param  callable|string  $callback* @param  array  $parameters* @param  string|null  $defaultMethod* @return mixed*/public static function call($container, $callback, array $parameters = [], $defaultMethod = null){if (static::isCallableWithAtSign($callback) || $defaultMethod) {return static::callClass($container, $callback, $parameters, $defaultMethod);}return static::callBoundMethod($container, $callback, function () use ($container, $callback, $parameters) {return call_user_func_array($callback, static::getMethodDependencies($container, $callback, $parameters));});}

第一个判断需要$callback是字符串,一般调不到。

    /*** Determine if the given string is in Class@method syntax.(确定给定的字符串是类”方法的语法。)** @param  mixed  $callback* @return bool*/protected static function isCallableWithAtSign($callback){return is_string($callback) && strpos($callback, '@') !== false;}

接下来看callBoundMethod方法

    /*** Call a method that has been bound to the container.(调用已绑定到容器的方法。)** @param  \Illuminate\Container\Container  $container* @param  callable  $callback* @param  mixed  $default* @return mixed*/protected static function callBoundMethod($container, $callback, $default){if (! is_array($callback)) {return $default instanceof Closure ? $default() : $default;}// Here we need to turn the array callable into a Class@method string we can use to// examine the container and see if there are any method bindings for this given// method. If there are, we can call this method binding callback immediately.$method = static::normalizeMethod($callback);if ($container->hasMethodBinding($method)) {return $container->callMethodBinding($method, $callback[0]);}return $default instanceof Closure ? $default() : $default;}

判断是否为数组,不是的话,判断是否闭包,直接执行传过来的闭包或类;

将数组递归化为一个类@方法字符串;

检查容器,并查看该方法是否有任何方法绑定;

如果有的话,我们可以调用这个方法立即绑定回调;(好像用来验证的$this->methodBindings一直是空。。。)

如果没有,判断是否闭包,直接执行传过来的闭包或类;

我们再来看下调用callBoundMethod时传的闭包吧

return static::callBoundMethod($container, $callback, function () use ($container, $callback, $parameters) {return call_user_func_array($callback, static::getMethodDependencies($container, $callback, $parameters));});

先看下getMethodDependencies方法,

    /*** Get all dependencies for a given method.(获取给定方法的所有依赖项。)** @param  \Illuminate\Container\Container* @param  callable|string  $callback* @param  array  $parameters* @return array*/protected static function getMethodDependencies($container, $callback, array $parameters = []){$dependencies = [];foreach (static::getCallReflector($callback)->getParameters() as $parameter) {static::addDependencyForCallParameter($container, $parameter, $parameters, $dependencies);}return array_merge($dependencies, $parameters);}

基本都是返回空数组,暂时先不入这个坑了,应该是对给定的回调做反射处理,获取给定调用参数的依赖性。

return call_user_func_array($callback, []);

那么多数情况,闭包函数执行的就是上面这段,而

$callback = [$provider, 'boot'];

所以说,就是执行了对应服务的boot方法,后面遇到其他情况,会继续做完善。

Lumen技术交流群:310493206

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/cxscode/p/7562853.html

Lumen开发:lumen源码解读之初始化(5)——注册(register)与启动(boot)相关推荐

  1. APS入门3-C#开发-从源码解读一个APS项目

    APS系列入门 APS入门1-综述 APS入门2-ortools APS入门3-从源码解读一个C# APS项目 APS入门4: 供应链与APS APS入门5:工厂管理 APS入门6-LEKIN学习与复 ...

  2. C++/Qt音视频通话开发MetaRTC源码解读,dtls交互流程,dtls抓包分析

    目录 dtls抓包分析 dtls流程,主叫发送Client Hello dtls流程,Application Data dtls流程,Encrypted Alert 本章内容解读MetaRTC开源代码 ...

  3. C++/Qt音视频通话开发MetaRTC源码解读,视频推流和拉流

    本章内容解读MetaRTC开源代码,无任何二次开发,用于学习交流. MetaRTC是国人开发的开源项目,适用各种场景音视频二次开发,可以去git阅读README,我们使用相对成熟的版本测试: Rele ...

  4. spring beans源码解读之--BeanFactory的注册

    beanFactory的继承关系如下图所示: (图片来源:http://www.myexception.cn/software-architecture-design/925888.html) 在上节 ...

  5. 【ElasticSearch】Es 源码之 CcrRestoreSourceService 源码解读

    文章目录 1.概述 2.构造方法 1.概述 在博客 [ElasticSearch]Es 源码之 LifecycleComponent 源码解读 中初始化了相关插件的CcrRestoreSourceSe ...

  6. 【ElasticSearch】Es 源码之 AutoFollowCoordinator 源码解读

    文章目录 1.概述 2.构造方法 3. start方法 1.概述 在博客 [ElasticSearch]Es 源码之 LifecycleComponent 源码解读 中初始化了相关插件的AutoFol ...

  7. 【ElasticSearch】Es 源码之 CleanerService 源码解读

    文章目录 1.概述 2.构造方法 1.概述 在博客 [ElasticSearch]Es 源码之 LifecycleComponent 源码解读 中初始化了相关插件的CleanerService ,其中 ...

  8. 【ElasticSearch】Es 源码之 Exporters 源码解读

    文章目录 1.概述 2.start 2.1 initExporters 1.概述 在博客 [ElasticSearch]Es 源码之 LifecycleComponent 源码解读 中初始化了相关插件 ...

  9. 【ElasticSearch】Es 源码之 CacheService 源码解读

    文章目录 1.概述 1.概述 在博客 [ElasticSearch]Es 源码之 LifecycleComponent 源码解读 中初始化了相关插件的LifecycleComponent ,其中初始化 ...

  10. 【ElasticSearch】Es 源码之 AsyncSearchMaintenanceService 源码解读

    文章目录 1.概述 1.概述 在博客 [ElasticSearch]Es 源码之 LifecycleComponent 源码解读 中初始化了相关插件的LifecycleComponent ,其中初始化 ...

最新文章

  1. 一口气说出 过滤器 和 拦截器 6个区别,别再傻傻分不清了
  2. rsync实现文件同步
  3. 机器学习(machine learning)之AdaBoost算法
  4. SQL数据库。按年,月,日查询
  5. Git迁移 从SVN到Git
  6. java 运算优先级_Java-运算符优先级
  7. 教你破资深加密工具lockdir.exe加密后的文件
  8. TurboMail邮件系统图片签名档功能
  9. 单个html页面面包屑,充分利用网页设计中的面包屑
  10. Android 活用RecyclerView分割线
  11. javacv 写mp4_JavaCV教程篇1之springboot调用ffmpeg将webm视频格式转换为MP4格式
  12. JRTPLIB使用实例
  13. elementui穿梭框数据不更新
  14. 转:什么是超融合?超融合有什么作用,超融合的概念.
  15. 卷积神经网络与神经网络,卷积神经网络基础知识
  16. dotproject安装问题
  17. iOS自定义相机界面
  18. Linux如何强制关闭PyCharm或者其他软件
  19. ImageIO.write 支持写入的图片格式 Java
  20. 星际争霸AI训练环境与自主规划决策问题初探

热门文章

  1. 如何给小朋友解释单摆运动_运维挑战:如何构建复杂环境下的适应性系统
  2. docker安装和启动zookeeper,数据导入及导出
  3. 用户信息填写web代码_zabbix监控系列之监控项(8、web监控)
  4. Collectors.collectingAndThen()
  5. php.ini添加的变量读取,php用ini_get获取php.ini里变量值的方法
  6. [渝粤教育] 中国地质大学 审计学 复习题
  7. 【Python实例第8讲】模型复杂度影响
  8. 基于K2 BPM的大型连锁企业开关店选址管理解决方案
  9. 【【模板】严格次小生成树[BJWC2010]】
  10. Yii2.0 两次奇葩的数据库连接经历