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