摘要:框架底層解析本文參考陳昊框架關鍵技術解析,搭建一個屬于自己的簡化版服務容器。服務容器建立項目空文件夾如添加,執行目的是為了學習利用的自動加載。
laravel框架底層解析
本文參考陳昊《Laravel框架關鍵技術解析》,搭建一個屬于自己的簡化版服務容器。
其中涉及到反射、自動加載,還是需要去了解一下。
建立項目空文件夾(如 mylaravel)
添加composer.json,執行composer install
{ "name": "laravel/laravel", "description": "The Laravel Framework.", "keywords": ["framework", "laravel"], "license": "MIT", "type": "project", "autoload": { "classmap": [ ], "psr-4": { "App": "app/" } } }
目的是為了學習、利用composer的自動加載。
文件路徑如下所示
mylaravel
app
Traveller
Traveller.php
Visit
Leg.php
Visit.php
Container.php
Index.php
vendor
composer.json
簡化版Container.php
getClosure($abstract, $concrete); } $this->bindings[$abstract] = compact("concrete", "shared"); } //默認的回調函數 protected function getClosure($abstract, $concrete) { //生成實例的回調函數, $c一般為ioc容器對象 return function($c) use ($abstract, $concrete) { $method = ($abstract == $concrete) ? "build" : "make"; return $c->$method($concrete); }; } //生成實例對象,首先解決接口和要實例化類之間的依賴 public function make($abstract) { $concrete = $this->getConcrete($abstract); if ($this->isBuildable($concrete, $abstract)) { $object = $this->build($concrete); } else { $object = $this->make($concrete); } return $object; } protected function isBuildable($concrete, $abstract) { return $concrete === $abstract || $concrete instanceof Closure; } //獲取綁定的回調函數 protected function getConcrete($abstract) { if ( ! isset($this->bindings[$abstract])) { return $abstract; } return $this->bindings[$abstract]["concrete"]; } //實例化對象 public function build($concrete) { if ($concrete instanceof Closure) { return $concrete($this); } $reflector = new ReflectionClass($concrete); if ( ! $reflector->isInstantiable()) { echo $message = "Target [$concrete] is not instantiable."; } $constructor = $reflector->getConstructor(); if (is_null($constructor)) { return new $concrete; } $dependencies = $constructor->getParameters(); $instances = $this->getDependencies($dependencies); return $reflector->newInstanceArgs($instances); } protected function getDependencies($parameters) { $dependencies = []; foreach ($parameters as $parameter) { $denpendency = $parameter->getClass(); if (is_null($denpendency)) { $dependencies[] = NULL; } else { $dependencies[] = $this->resolveClass($parameter); } } return (array) $dependencies; } protected function resolveClass(ReflectionParameter $parameter) { return $this->make($parameter->getClass()->name); } }
Visit.php接口
Leg.php接口的一種實現
Traveller.php相當于Controller下的方法
trafficTool = $visit; } public function visitTibet() { $this->trafficTool->go(); } }Index.php
bind("AppVisitVisit", "AppVisitLeg"); $app->bind("Traveller", "AppTravellerTraveller"); //通過容器實現依賴注入,完成類的實例化 $tra = $app->make("AppTravellerTraveller"); $tra->visitTibet(); } } $b = new Index; $b->index();
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/22433.html
摘要:劃下重點,服務容器是用于管理類的依賴和執行依賴注入的工具。類的實例化及其依賴的注入,完全由服務容器自動的去完成。 本文首發于 深入剖析 Laravel 服務容器,轉載請注明出處。喜歡的朋友不要吝嗇你們的贊同,謝謝。 之前在 深度挖掘 Laravel 生命周期 一文中,我們有去探究 Laravel 究竟是如何接收 HTTP 請求,又是如何生成響應并最終呈現給用戶的工作原理。 本章將帶領大...
摘要:的核心概念包括服務容器服務提供者門面契約。所有服務提供者都需要繼承類。可以為服務提供者的方法設置類型提示。方法將在所有其他服務提供者均已注冊之后調用。同樣會整理成思維導圖的形式以方便記憶與回顧。 showImg(https://segmentfault.com/img/remote/1460000010771201); Laravel 的核心概念包括:服務容器、服務提供者、門面(Fac...
摘要:理解服務容器的概念,對于我們使用太重要了,應該說是否理解服務容器的概念是區分是否入門的重要條件。因為整個框架正是在服務容器這一基礎上構建起來的。 本篇文章轉載自我的個人博客原文地址SampsonBlog 如果說laravel框架的核心是什么,那么無疑是服務容器。理解服務容器的概念,對于我們使用laravel太重要了,應該說是否理解服務容器的概念是區分是否入門laravel的重要條件。因...
摘要:本篇承接使用構建環境,介紹如何在該文所用的容器中運行項目。接下來可以新建一個項目或是通過轉移項目。從上同步項目一般服務器中運行的項目都是在本地開發完成后同步上去的。生成文件文件含有項目所需的配置以及用于加密解密的隨機字符串。 本篇承接 使用 Docker 構建 LNMP 環境,介紹如何在該文所用的容器中運行 Laravel 項目。主要步驟為:轉移 Laravel 項目到數據卷 => 配...
摘要:簡述的生命周期采用了單一入口模式,應用的所有請求入口都是文件。分發請求一旦應用完成引導和所有服務提供者都注冊完成,將會移交給路由進行分發。此外,由于對動態方法的獨特用法,也使測試起來非常容易。 本書的 GitHub 地址:https://github.com/todayqq/PH... Laravel 作為現在最流行的 PHP 框架,其中的知識較多,所以單獨拿出來寫一篇。 簡述 La...
摘要:用匿名函數的好處在于,這個服務綁定到容器以后,并不會立即產生服務最終的對象,只有在這個服務解析的時候,匿名函數才會執行,此時才會產生這個服務對應的服務實例。 前言 ? 老實說,第一次老大讓我看laravel框架手冊的那天早上,我是很絕望的,因為真的沒接觸過,對我這種渣渣來說,laravel的入門門檻確實有點高了,但還是得硬著頭皮看下去(雖然到現在我還有很多沒看懂,也沒用過)。? 后面慢...
閱讀 3544·2021-09-10 10:51
閱讀 2518·2021-09-07 10:26
閱讀 2495·2021-09-03 10:41
閱讀 821·2019-08-30 15:56
閱讀 2909·2019-08-30 14:16
閱讀 3497·2019-08-30 13:53
閱讀 2113·2019-08-26 13:48
閱讀 1925·2019-08-26 13:37