laravel的启动需要通过路由、中间件、控制器、模型、视图最后出现在浏览器。而路由、中间件、模型,这些功能都有自己的类,比如Route::any()、DB::table()、$this->middleware()等等,这些功能都是由一个叫IOC(服务容器)的对象来调配的。
它就像框架里的一个管家,我们需要某些功能的时候不需要去自己new、去考虑运行这A对象还需要把哪些对象传入A对象里才能运行了。laravel的index入口文件只管制造一个ioc实例,然后把request对象传入其中。
ioc容器中有一个叫provider的概念,大多数功能都有一个provider,它的作用就是把一个功能需要用到的类,这些类的路径及所需要的一些东西记录起来,在ioc实例化的时候调用其中一些基础服务。ioc在实例化的时候,会把一些基础的provider调用起来,这些基础provider又调用了自身的初始化函数,来实现了一些自动化功能。
在public/index.php文件内,laravel首先加载了autoload方法,似乎是通过composer的方式实现的;
随后引入bootstrap/app.php文件,文件内实例化了application类,并通过该应用实例注册了Http、Kernel、Handler的共享绑定。
再看application类,继承自Container类,并继承了ApplicationContract接口(另一个application类,应该是实现了部分系统方法),与http核心接口(这里通过symfony的请求与响应类来实现接口)
插一张不知道从哪盗来的Application的继承关系图
在laravel把系统基础核心初始化完毕后,便通过application 的 make 方法,传入了http核心的类名来获取别名(在container类的aliases属性中,存储了众多类名与别名的键值对,似乎是通过类名到别名,再到实例的方式来获取的,数组见下方)
1 container->aliases 2 = 3 array:64 [▼ 4 "Illuminate\Foundation\Application" => "app" 5 "Illuminate\Contracts\Container\Container" => "app" 6 "Illuminate\Contracts\Foundation\Application" => "app" 7 "Psr\Container\ContainerInterface" => "app" 8 "Illuminate\Auth\AuthManager" => "auth" 9 "Illuminate\Contracts\Auth\Factory" => "auth" 10 "Illuminate\Contracts\Auth\Guard" => "auth.driver" 11 "Illuminate\View\Compilers\BladeCompiler" => "blade.compiler" 12 "Illuminate\Cache\CacheManager" => "cache" 13 "Illuminate\Contracts\Cache\Factory" => "cache" 14 "Illuminate\Cache\Repository" => "cache.store" 15 "Illuminate\Contracts\Cache\Repository" => "cache.store" 16 "Illuminate\Config\Repository" => "config" 17 "Illuminate\Contracts\Config\Repository" => "config" 18 "Illuminate\Cookie\CookieJar" => "cookie" 19 "Illuminate\Contracts\Cookie\Factory" => "cookie" 20 "Illuminate\Contracts\Cookie\QueueingFactory" => "cookie" 21 "Illuminate\Encryption\Encrypter" => "encrypter" 22 "Illuminate\Contracts\Encryption\Encrypter" => "encrypter" 23 "Illuminate\Database\DatabaseManager" => "db" 24 "Illuminate\Database\Connection" => "db.connection" 25 "Illuminate\Database\ConnectionInterface" => "db.connection" 26 "Illuminate\Events\Dispatcher" => "events" 27 "Illuminate\Contracts\Events\Dispatcher" => "events" 28 "Illuminate\Filesystem\Filesystem" => "files" 29 "Illuminate\Filesystem\FilesystemManager" => "filesystem" 30 "Illuminate\Contracts\Filesystem\Factory" => "filesystem" 31 "Illuminate\Contracts\Filesyste