掌握Laravel框架中容器的管理依賴實(shí)現(xiàn)松耦合
1、什么是容器
容器是一個(gè)用于管理類依賴和執(zhí)行類依賴注入的工具,簡(jiǎn)而言之,容器就是我們?cè)趹?yīng)用程序中定義、綁定和解析依賴項(xiàng),以實(shí)現(xiàn)松耦合和可測(cè)試性。在laravel中應(yīng)用本身就是一個(gè)容器,容器管理調(diào)用各種服務(wù) laravel在運(yùn)行的時(shí)候會(huì)創(chuàng)建一個(gè)app對(duì)象 這個(gè)對(duì)象就是容器 所有的服務(wù)都是在app中調(diào)用的。
幾乎所有的服務(wù)容器綁定都會(huì)在服務(wù)提供者中注冊(cè),在服務(wù)提供者中可以通過blind方法去注冊(cè)一個(gè)綁定,也可以通過單例singleton去注冊(cè)綁定,還有instance等方法注冊(cè)綁定。
2、依賴注入
在Laravel框架中,開發(fā)者可以使用以下方式實(shí)現(xiàn)依賴注入:
1.在控制器的構(gòu)造函數(shù)中聲明依賴 注入Application實(shí)例
public function __construct(Application $app) { $this->app = $app; }
2.在控制器方法中聲明依賴 注入Closure實(shí)例
public function handle($request, Closure $next, ...$guards) { $this->authenticate($request, $guards); return $next($request); }
3.使用閉包函數(shù)生成對(duì)象
use?App\Repositories\UserRepository; use?App\Services\UserService; use?Illuminate\Contracts\Container\Container; class?UserController?extends?Controller { ????protected?$container; ????public?function?__construct(Container?$container) ????{ ????????$this->container?=?$container; ????} ????public?function?getUser($id) ????{ ????????$userService?=?$this->container->make(UserService::class,?[ ????????????'userRepository'?=>?$this->container->make(UserRepository::class), ????????]); ????????$user?=?$userService->getUser($id); ????????return?view('user',?compact('user')); ????} }
上面的代碼中,我們?cè)跇?gòu)造函數(shù)中注入了一個(gè)Container對(duì)象,然后通過make方法生成了一個(gè)UserService對(duì)象,并將UserRepository對(duì)象作為參數(shù)傳遞給make方法。
3、IOC(控制反轉(zhuǎn))
控制反轉(zhuǎn)(Inversion of Control,IoC)是面向?qū)ο缶幊讨械囊环N設(shè)計(jì)模式,它是一種將控制權(quán)轉(zhuǎn)移給另一個(gè)對(duì)象的方式,以達(dá)到降低代碼的耦合度的目的。
class A { protected $b; public function __construct(B $b) { $this->b = $b; } public function getB(){ return $this->b->bMethod(); } } class B { public function __construct() {} public function bMethod(){ return "Hello World!"; } } // IOC容器類 class Ioc { protected $instances = []; public function __construct() { $this->instances['B'] = new B(); $this->instances['C'] = new C(); $this->instances['D'] = new D(); } public function make($abstract){ return $this->instances[$abstract]; } } // 控制反轉(zhuǎn):類與類的依賴關(guān)系不再在類A中創(chuàng)建, // 而是通過IOC容器生成類B后通過參數(shù)的形式傳入類A中; $ioc = new Ioc(); $b = $ioc->make('B'); $a = new A($b); $a->getB();
4、反射
反射是程序?qū)崿F(xiàn)依賴注入的基礎(chǔ),也是Laravel服務(wù)容器實(shí)現(xiàn)服務(wù)解析的基礎(chǔ)
反射函數(shù)參考:
ReflectionClass 報(bào)告了一個(gè)類的有關(guān)信息 ReflectionClass::getConstructor — 獲取類的構(gòu)造函數(shù) ReflectionClass::getConstructor::getParameters — 獲取到Constructor的屬性值 ReflectionClass::newInstanceArgs — 從給出的參數(shù)創(chuàng)建一個(gè)新的類實(shí)例。 ReflectionParameter::getClass — 獲得類型提示類。 ReflectionParameter::isDefaultValueAvailable — 檢查是否有默認(rèn)值。 ReflectionParameter::getDefaultValue — 獲取到默認(rèn)的屬性值
如下幾組方法,就是反射。
//獲取類的反射信息,也就是類的所有信息 $reflector = new ReflectionClass(類名); echo $reflector->getDocComment(); 獲取類的注釋信息 //獲取反射類的構(gòu)造函數(shù)信息 $constructor = $reflector->getConstructor(); //獲取反射類的構(gòu)造函數(shù)的參數(shù) $dependencies = $constructor->getParameters();
以上就是掌握Laravel框架中容器管理依賴實(shí)現(xiàn)松耦合的詳細(xì)內(nèi)容,更多關(guān)于Laravel框架容器管理依賴的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
PHPStorm2020.1永久激活及下載更新至2020(推薦)
這篇文章主要介紹了PHPStorm2020.1永久激活及下載更新至2020,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09使用phpunit進(jìn)行接口自動(dòng)化測(cè)試
下面小編就為大家分享一篇使用phpunit進(jìn)行接口自動(dòng)化測(cè)試,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2018-03-03PHP封裝請(qǐng)求類實(shí)例分析【基于Yii框架】
這篇文章主要介紹了PHP封裝請(qǐng)求類,結(jié)合實(shí)例形式分析了基于Yii框架的curl封裝請(qǐng)求處理的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-10-10thinkphp實(shí)現(xiàn)like模糊查詢實(shí)例
這篇文章主要介紹了thinkphp實(shí)現(xiàn)like模糊查詢,以實(shí)例形式講述了字符串形式及數(shù)組形式作為查詢條件的like模糊查詢實(shí)現(xiàn)方法,是非常具有實(shí)用價(jià)值的技巧,需要的朋友可以參考下2014-10-10Linux下從零開始安裝配置Nginx服務(wù)器+PHP開發(fā)環(huán)境
這篇文章主要介紹了Linux下從零開始安裝配置Nginx服務(wù)器+PHP開發(fā)環(huán)境的教程,文中采用的是最主流的FastCGI連接方法,需要的朋友可以參考下2015-12-12