$kernel?=?$app->make(Illuminate\Contracts\Http\Kernel::class);
#實(shí)例化Kernel
在應(yīng)用實(shí)例化時(shí),已經(jīng)初始化了很多的基礎(chǔ)操作,所以下面的建構(gòu)方法將會(huì)直接使用服務(wù)容器的依賴注入來(lái)解決類別之間的依賴關(guān)係。
//?\Illuminate\Contracts\Http\Kernel?類構(gòu)造器依賴?\Illuminate\Contracts\Foundation\Application?和?\Illuminate\Routing\Router,將會(huì)通過(guò)服務(wù)容器來(lái)處理依賴關(guān)系 public?function?__construct(Application?$app,?Router?$router) { ????$this->app?=?$app; ????//?主要委托?$router?來(lái)處理 ????$this->router?=?$router; ????//?以下均為中間件的設(shè)置 ????$router->middlewarePriority?=?$this->middlewarePriority; ????foreach?($this->middlewareGroups?as?$key?=>?$middleware)?{ ????????$router->middlewareGroup($key,?$middleware); ????} ????foreach?($this->routeMiddleware?as?$key?=>?$middleware)?{ ????????$router->aliasMiddleware($key,?$middleware); ????} } \Illuminate\Contracts\Foundation\Application?的處理: make?時(shí)通過(guò)別名方式直接調(diào)用?$this->instances['app'] \Illuminate\Routing\Router?的處理: make?時(shí)通過(guò)別名方式直接調(diào)用?$this->bindings['router']?數(shù)組里面?concrete?對(duì)應(yīng)的匿名函數(shù) Router?依賴?\Illuminate\Contracts\Events\Dispatcher?和?\Illuminate\Container\Container public?function?__construct(Dispatcher?$events,?Container?$container?=?null) { ????$this->events?=?$events; ????$this->routes?=?new?RouteCollection; ????$this->container?=?$container??:?new?Container; } \Illuminate\Contracts\Events\Dispatcher?的處理: make?時(shí)通過(guò)別名方式直接調(diào)用?$this->bindings['events']?數(shù)組里面?concrete?對(duì)應(yīng)的匿名函數(shù) Dispatcher?依賴?\Illuminate\Contracts\Container\Container public?function?__construct(ContainerContract?$container?=?null) { ????$this->container?=?$container??:?new?Container; } \Illuminate\Container\Container?的處理: make?時(shí)直接調(diào)用?$this->instances['Illuminate\Container\Container']?=?Object(app) \Illuminate\Contracts\Container\Container?的處理: make?時(shí)調(diào)用別名直接調(diào)用?$this->instances['app']?=?Object(app) 上面兩個(gè)一樣,沒(méi)有區(qū)別
注意:以上所列出的依賴關(guān)係,都直接委託給服務(wù)容器進(jìn)行自動(dòng)處理了,不需要害怕
對(duì)$this-> bindings['router'] 和$this->bindings['events'] 綁定事件的處理,make 時(shí)將會(huì)直接呼叫數(shù)組鍵concrete 對(duì)應(yīng)的匿名函數(shù)。
make 時(shí)使用到的程式碼片段
############################################## if?($concrete?instanceof?Closure)?{???????????? ????return?$concrete($this,?end($this->with));? } ############################################### $this->bindings['router']?=?[ ????????'concrete'?=>?function?($app)?{ ????????????????????????????return?new?Router($app['events'],?$app); ????????????????????????}, ????????'shared'?=>?'true', ????]; $router?=?new?Router($app['events'],?$app); \Illuminate\Routing\Router public?function?__construct(Dispatcher?$events,?Container?$container?=?null) { ????$this->events?=?$events; ????$this->routes?=?new?RouteCollection; ????$this->container?=?$container??:?new?Container; }
返回一個(gè)Router 對(duì)象,同時(shí)會(huì)重設(shè)$this->instances['router'] = $router 對(duì)象,讓下次直接調(diào)用。
$this->bindings['events']?=?[ ????'concrete'?=>?function?($app)?{ ????????????return?(new?Dispatcher($app))->setQueueResolver(function?()?use?($app)?{ ????????????????return?$app->make(QueueFactoryContract::class); ????????????}); ????????????} ????'shared'?=>?'true', ]; $dispatcher?=?(new?\Illuminate\Events\Dispatcher($app))->setQueueResolver(function?()?use?($app)?{ ????????????????return?$app->make(QueueFactoryContract::class); ????????????}); Illuminate\Events\Dispatcher: public?function?__construct(ContainerContract?$container?=?null) { ????$this->container?=?$container??:?new?Container; } public?function?setQueueResolver(callable?$resolver) { ????$this->queueResolver?=?$resolver; ????return?$this; }
傳回一個(gè) Dispatcher 對(duì)象,同時(shí)會(huì)重置 $this->instances['events'] = $dispatcher 對(duì)象,以便下次直接呼叫。
注意: ?
kernel物件是融合了應(yīng)用和路由的對(duì)象,路由又注入了IlluminateEventsDispatcher對(duì)象,此為核心對(duì)象。