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