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