摘要:實(shí)例化實(shí)例化在應(yīng)用進(jìn)行實(shí)例化時(shí),已經(jīng)初始化了很多的基礎(chǔ)操作,所以下面的構(gòu)造方法將會(huì)直接使用服務(wù)容器的依賴(lài)注入來(lái)解決類(lèi)之間的依賴(lài)關(guān)系。返回一個(gè)對(duì)象,同時(shí)會(huì)重置對(duì)象,供下次直接調(diào)用。
Laravel Kernel實(shí)例化
$kernel = $app->make(IlluminateContractsHttpKernel::class);實(shí)例化 Kernel
在應(yīng)用進(jìn)行實(shí)例化時(shí),已經(jīng)初始化了很多的基礎(chǔ)操作,所以下面的構(gòu)造方法將會(huì)直接使用服務(wù)容器的依賴(lài)注入來(lái)解決類(lèi)之間的依賴(lài)關(guān)系。
// IlluminateContractsHttpKernel 類(lèi)構(gòu)造器依賴(lài) IlluminateContractsFoundationApplication 和 IlluminateRoutingRouter,將會(huì)通過(guò)服務(wù)容器來(lái)處理依賴(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); } } IlluminateContractsFoundationApplication 的處理: make 時(shí)通過(guò)別名方式直接調(diào)用 $this->instances["app"] IlluminateRoutingRouter 的處理: make 時(shí)通過(guò)別名方式直接調(diào)用 $this->bindings["router"] 數(shù)組里面 concrete 對(duì)應(yīng)的匿名函數(shù) Router 依賴(lài) IlluminateContractsEventsDispatcher 和 IlluminateContainerContainer public function __construct(Dispatcher $events, Container $container = null) { $this->events = $events; $this->routes = new RouteCollection; $this->container = $container ?: new Container; } IlluminateContractsEventsDispatcher 的處理: make 時(shí)通過(guò)別名方式直接調(diào)用 $this->bindings["events"] 數(shù)組里面 concrete 對(duì)應(yīng)的匿名函數(shù) Dispatcher 依賴(lài) IlluminateContractsContainerContainer public function __construct(ContainerContract $container = null) { $this->container = $container ?: new Container; } IlluminateContainerContainer 的處理: make 時(shí)直接調(diào)用 $this->instances["IlluminateContainerContainer"] = Object(app) IlluminateContractsContainerContainer 的處理: make 時(shí)調(diào)用別名直接調(diào)用 $this->instances["app"] = Object(app) 上面兩個(gè)一樣,沒(méi)有區(qū)別
注意:以上所列出的依賴(lài)關(guān)系,都直接委托給服務(wù)容器進(jìn)行自動(dòng)處理了,不需要怕怕
對(duì) $this->bindings["router"] 和 $this->bindings["events"] 綁定事件的處理,make 時(shí)將會(huì)直接調(diào)用數(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); IlluminateRoutingRouter 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ì)重置 $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 IlluminateEventsDispatcher($app))->setQueueResolver(function () use ($app) { return $app->make(QueueFactoryContract::class); }); IlluminateEventsDispatcher: 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ì)象,供下次直接調(diào)用。
注意:
kernel對(duì)象是融合了應(yīng)用和路由的對(duì)象,路由又注入了IlluminateEventsDispatcher對(duì)象,此為核心對(duì)象。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/22611.html
摘要:初步嘗試既然最常見(jiàn)的注冊(cè)命令的方式是修改類(lèi)中的,那么一般正常人都會(huì)從這邊開(kāi)始下手。又要自己取出實(shí)例,又要自己調(diào)用方法,調(diào)用方法之前還有自己先把實(shí)例化這么繁瑣,肯定不是運(yùn)行時(shí)添加命令的最佳實(shí)踐,所以我決定繼續(xù)尋找更優(yōu)解。 本文首發(fā)于我的博客,原文鏈接:https://blessing.studio/best-... 雖然 Laravel 官方文檔提供的添加 Artisan Command...
摘要:請(qǐng)求周期加載自動(dòng)加載器獲取應(yīng)用對(duì)象實(shí)例化應(yīng)用解析此對(duì)象貫穿全文主要過(guò)程設(shè)置基礎(chǔ)路徑基礎(chǔ)綁定注冊(cè)全局基礎(chǔ)服務(wù)核心容器別名設(shè)置注冊(cè)三個(gè)單例獲取對(duì)象實(shí)例化此對(duì)象為應(yīng)用的樞紐,將會(huì)協(xié)調(diào)各部分之間的工作,完成請(qǐng)求主要過(guò)程注入應(yīng)用對(duì)象注入事件對(duì)象注入 Laravel 請(qǐng)求周期 加載 composer 自動(dòng)加載器 require __DIR__./../bootstrap/autoload.php;...
摘要:本章講解反射類(lèi)的使用及對(duì)反射的使用。各位很清楚,方法用于解析類(lèi),所有方法的實(shí)現(xiàn)一定是在引用的文件內(nèi)。致謝感謝你看到這里,本篇文章源碼解析靠個(gè)人理解。 showImg(https://segmentfault.com/img/bVbhjvY?w=600&h=296); 前言 PHP的反射類(lèi)與實(shí)例化對(duì)象作用相反,實(shí)例化是調(diào)用封裝類(lèi)中的方法、成員,而反射類(lèi)則是拆封類(lèi)中的所有方法、成員變量,并...
摘要:請(qǐng)求處理階段請(qǐng)求處理階段首先是準(zhǔn)備請(qǐng)求處理的環(huán)境,包括環(huán)境加載服務(wù)提供者注冊(cè)等環(huán)節(jié),然后將請(qǐng)求實(shí)例通過(guò)中間件處理及通過(guò)路由和控制器的分發(fā)控制,使得不同的請(qǐng)求通過(guò)相應(yīng)的處理程序進(jìn)行處理并生成響應(yīng)的過(guò)程。 Laravel請(qǐng)求到響應(yīng)的整個(gè)執(zhí)行過(guò)程,主要可以歸納為四個(gè)階段,即程序啟動(dòng)準(zhǔn)備階段、請(qǐng)求實(shí)例化階段、請(qǐng)求處理階段、響應(yīng)發(fā)送和程序終止階段。 程序啟動(dòng)準(zhǔn)備階段 服務(wù)容器實(shí)例化 服務(wù)容器的實(shí)...
摘要:年月日階段劃分請(qǐng)求到響應(yīng)的整個(gè)執(zhí)行階段歸納為個(gè)程序啟動(dòng)準(zhǔn)備階段文件自動(dòng)加載服務(wù)容器實(shí)例化基礎(chǔ)服務(wù)提供者的注冊(cè)核心類(lèi)的實(shí)例化請(qǐng)求實(shí)例化階段實(shí)例化實(shí)例請(qǐng)求處理階段準(zhǔn)備請(qǐng)求處理的環(huán)境將請(qǐng)求實(shí)例通過(guò)中間件處理及通過(guò)路由和控制器的分發(fā)控制響應(yīng)發(fā)送和 Last-Modified: 2019年5月10日16:19:07 階段劃分 Laravel 5.5請(qǐng)求到響應(yīng)的整個(gè)執(zhí)行階段歸納為 4 個(gè): ...
閱讀 2686·2023-04-25 15:15
閱讀 1327·2021-11-25 09:43
閱讀 1614·2021-11-23 09:51
閱讀 1090·2021-11-12 10:36
閱讀 2891·2021-11-11 16:55
閱讀 966·2021-11-08 13:18
閱讀 736·2021-10-28 09:31
閱讀 2061·2019-08-30 15:47