laravel历险记

  1. 什么时候会调用自动加载函数,就是需要一个类的时候(实例化一个类、调用一个类的静态方法等显式调用时)
  2. laravel自动加载用的是composer,主要是AliasLoader的load()函数,ClassLoader.php和autoload_static.php(纽带是autoload_real.php)
  3. 找类对应的文件,在ClassLoader.php中的findFile()函数
  4. require()一个文件,文件里如果有返回值。require()就相当于是这个返回值
  5. 还有一个能当变量用的,就是闭包。能用变量的地方,就可以用闭包,闭包更灵活。框架一般也会支持在填变量的地方,填写闭包
  6. 获取给定抽象类的实例,是通过Illuminate\Container\Container类的getConcrete()
  7. 获得上下文绑定,通过Illuminate\Container\Container类的getContextualConcrete()。[spin through them and check]
  8. 解析过的抽象类都存在instances和bindings数组
  9. 判断抽象类有没有解析过,看Illuminate\Container\Container.php的resolved()方法
  10. container的buildStack属性是在build()函数里操作的
  11. array_unshift()<--->array_shift()[进队列、出队列];array_push()<--->array_pop()[进栈、出栈]
  12. 解析服务提供者是Illuminate\Foundation\Application类的resolveProvider()
  13. 已经注册过的服务提供者,存在Illuminate\Foundation\Application中的$serviceProviders数组中
  14. 解析门面是在Illuminate\Support\Facades\Facade类的resolveFacadeInstance()
  15. 有两个alias,一个是门面类的alias,一个是application的alias。一般通过门面的alias,找到application的alias,最后解析绑定的闭包或者concrete类
  16. concrete类的属性,一般是在构造初始化时赋予
  17. 通过Symfony\Component\HttpFoundation\Request的createFromGlobals()方法从PHP的globals全局数组中创建一个请求实例
  18. 请求的数据应该都存在\Symfony\Component\HttpFoundation\ParameterBag类
  19. Illuminate\Container\Container类的build(),为绑定的闭包提供了参数
  20. 通过$kernel->handle()开始处理请求实例
  21. 通过Illuminate\Foundation\Http\Kernel的sendRequestThroughRouter()方法开始分发请求
  22. 事件分发用的是Illuminate\Events\Dispatcher类
  23. $callback($object, $this)【Illuminate\Container\Container类中的fireCallbackArray()】(Fire an array of callbacks with an object)
  24. 判断某个回调是不是,某个对象的。在Container类中的getCallbacksForType()。不同时机/类型的回调放在不同的数组中。
  25. 处理请求实例的启动工作是在Illuminate\Foundation\Http\Kernel类中的$bootstrappers数组中
  26. 这些启动项的缓存文件都存在于bootstrap的cache目录下
  27. laravel接受Cli的请求参数类是symfony\console\Input\ArgvInput类
  28. 引导.env文件是在vlucas\phpdotenv\src\Loader类中的load()方法
  29. 读取.env中的内容到数组,是vlucas\phpdotenv\src\Loader类中的readLinesFromFile()方法
  30. vlucas\phpdotenv\src\Loader类中的isComment()判断了当前行是否为注释
  31. vlucas\phpdotenv\src\Loader类中的looksLikeSetter()判断了是不是在赋值
  32. list($name, $value) = array_map('trim', explode('=', $name, 2));拆分赋值的key和value
  33. 把.env配置文件的内容也设置到了Apache[apache_setenv()];putenv():设置当前请求期间的环境变量、$_ENV、$_SERVER
  34. laravel找文件是通过Symfony\Component\Finder\Finder类实现的
  35. array stream_get_meta_data ( int $fp ):从封装协议文件指针中取得报头/元数据
  36. php有很多内置的文件操作扩展类:SplFileInfo、RecursiveDirectoryIterator、RecursiveIterator
  37. foreach()一个目录时,会走到迭代器的方法,会调用getIterator()方法,返回一个当前Finder配置的迭代器
  38. config下面的配置文件信息都保存在Illuminate\Config\Repository的$items属性
  39. 通过Support\Arr.php中的get(),解析config的‘.’。类似递归(递归赋值);找别名也是递归,不过是递归调用的方法。例如Illuminate\Support\Arr类的get($array, $key, $default = null)
  40. laravel的异常处理是Illuminate\Foundation\Bootstrap\HandleExceptions类
  41. 判断laravel当前执行环境的函数是Illuminate\Foundation\Application类的environment()函数
  42. 门面类的自动加载函数注册是在Illuminate\Foundation\AliasLoader类的register(),因为是prependToLoaderStack()【栈】,所以是第一个走的自动加载函数
  43. Illuminate\Support\Facades\Facade类的clearResolvedInstance()清除一个已解析的门面,清除所有的已解析门面是clearResolvedInstances()
  44. Illuminate\Foundation\ProviderRepository类的load()方法,加载app.config中的providers以及packages的服务提供者
  45. 获取所有包的服务提供者:Illuminate\Foundation\PackageManifest类的provider()
  46. 判断包的服务提供者缓存是否需要重新编译,Illuminate\Foundation\ProviderRepository类的shouldRecompile()
  47. 设置控制器的根命名空间是RouteServiceProvider类的boot(),以及定义api和web路由
  48. Illuminate\Foundation\Application类的booted()注册"booted"的listener
  49. request是在分发路由的时候,instance()到容器中的
  50. array_reduce(array $input, callable $function [,mixed $initial = NULL]):将回调函数function迭代地作用到input数组中的每一个单元中,从而将input数组转化为单一的值(如果指定了可选参数initial,该参数将被当成是数组中的第一个值来处理,或者数组为空就作为最终返回值)
  51. array_map()、array_walk():只能用用户自定义的函数
  52. laravel通过管道pipeline将请求request经过中间件,其中堆栈$stack只是保存还未执行的pipeline内容,每次中间件执行的的$parameters参数都是两个值(请求$request、要执行的堆栈$stack,其中每次中间件只是用到了$request)
  53. 路由分发的管理者是Illuminate\Routing\Router
  54. 通过请求找到对应的路由是Illuminate\Routing\Router的findRoute()
  55. 最终是Illuminate\Routing\Route的matches()用请求request匹配路由route
  56. 内部请求用的是dingoApi,搭桥到laravel的Request是dingo\api\src\Dispatcher类的createRequest()
  57. 开启表单参数验证,是在FormRequestServiceProvider类的boot()中
  58. 表单参数验证是Illuminate\Foundation\Http\FormRequest类引用的ValidatesWhenResolvedTrait的validate()
  59. 表单参数验证方法都在Illuminate\Validation\Concerns\ValidatesAttributes类
  60. 自定义验证的消息,存在Illuminate\Validation\Validator类的$customMessages属性
  61. 验证消息占位符的替换,在Illuminate\Validation\Concerns\FormatsMessages类的makeReplacements()
  62. Illuminate\Database\DatabaseManager类是用来管理数据库连接的
  63. Illuminate\Database\DatabaseManager类的getDefaultConnection()获取config里面配置的默认连接database.php的default
  64. Illuminate\Database\DatabaseManager类的connection()用来连接数据库的
  65. Builder也是领域模型
  66. Illuminate\Database\Eloquent\Builder有关的查询宏都在$localMacros,比如restore、withTrashed等
  67. 查询绑定在lluminate\Database\Query\Builder类的$bindings
  68. lluminate\Database\Query\Builder类的onDelete()用来设置model删除功能
  69. withCount()里面的关联关系可以用as取别名
  70. 给model设置的属性都会被relation给覆盖掉,因为Illuminate\Database\Eloquent\Model的toArray()中用了array_merge()函数
  71. 获取一个model的attributes和relations的方法最终都是Illuminate\Database\Eloquent\Concerns\HasAttributes类的getArrayableItems()只是传入的参数不同
  72. model的relation只可能是array或者null,Illuminate\Database\Eloquent\Concerns\HasAttributes类的relationsToArray()
  73. Illuminate\Database\Eloquent\Concerns\HasAttributes类的fromDateTime()用于在设置日期的时候转换为数据库date字段的类型
  74. 在response()一个继承了JosnSerializable interface的类都会自动调用jsonSerialize()方法,里面也调用了model的toArray()
  75. Jwt的验证在Illuminate\Auth\SessionGuard类的validate()
  76. validate类取决于配置文件,应该是Illuminate\Auth\AuthManager类的resolve()
  77. jwt应该是通过Providers\Auth\IlluminateAuthAdapter类的byId()验证
  78. laravel中str的snake是指把字符串变为下划线的小写str
  79. preg_match_all()输出结果$matches,注意$matches[0]与$matches[1]的区别

猜你喜欢

转载自blog.csdn.net/qq_37699037/article/details/80670774