掌握Laravel框架中容器的管理依賴實現(xiàn)松耦合
1、什么是容器
容器是一個用于管理類依賴和執(zhí)行類依賴注入的工具,簡而言之,容器就是我們在應(yīng)用程序中定義、綁定和解析依賴項,以實現(xiàn)松耦合和可測試性。在laravel中應(yīng)用本身就是一個容器,容器管理調(diào)用各種服務(wù) laravel在運行的時候會創(chuàng)建一個app對象 這個對象就是容器 所有的服務(wù)都是在app中調(diào)用的。
幾乎所有的服務(wù)容器綁定都會在服務(wù)提供者中注冊,在服務(wù)提供者中可以通過blind方法去注冊一個綁定,也可以通過單例singleton去注冊綁定,還有instance等方法注冊綁定。
2、依賴注入
在Laravel框架中,開發(fā)者可以使用以下方式實現(xiàn)依賴注入:
1.在控制器的構(gòu)造函數(shù)中聲明依賴 注入Application實例
public function __construct(Application $app) { $this->app = $app; }
2.在控制器方法中聲明依賴 注入Closure實例
public function handle($request, Closure $next, ...$guards) { $this->authenticate($request, $guards); return $next($request); }
3.使用閉包函數(shù)生成對象
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')); ????} }
上面的代碼中,我們在構(gòu)造函數(shù)中注入了一個Container對象,然后通過make方法生成了一個UserService對象,并將UserRepository對象作為參數(shù)傳遞給make方法。
3、IOC(控制反轉(zhuǎn))
控制反轉(zhuǎn)(Inversion of Control,IoC)是面向?qū)ο缶幊讨械囊环N設(shè)計模式,它是一種將控制權(quán)轉(zhuǎn)移給另一個對象的方式,以達到降低代碼的耦合度的目的。
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ù)容器實現(xiàn)服務(wù)解析的基礎(chǔ)
反射函數(shù)參考:
ReflectionClass 報告了一個類的有關(guān)信息 ReflectionClass::getConstructor — 獲取類的構(gòu)造函數(shù) ReflectionClass::getConstructor::getParameters — 獲取到Constructor的屬性值 ReflectionClass::newInstanceArgs — 從給出的參數(shù)創(chuàng)建一個新的類實例。 ReflectionParameter::getClass — 獲得類型提示類。 ReflectionParameter::isDefaultValueAvailable — 檢查是否有默認值。 ReflectionParameter::getDefaultValue — 獲取到默認的屬性值
如下幾組方法,就是反射。
//獲取類的反射信息,也就是類的所有信息 $reflector = new ReflectionClass(類名); echo $reflector->getDocComment(); 獲取類的注釋信息 //獲取反射類的構(gòu)造函數(shù)信息 $constructor = $reflector->getConstructor(); //獲取反射類的構(gòu)造函數(shù)的參數(shù) $dependencies = $constructor->getParameters();
以上就是掌握Laravel框架中容器管理依賴實現(xiàn)松耦合的詳細內(nèi)容,更多關(guān)于Laravel框架容器管理依賴的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
PHPStorm2020.1永久激活及下載更新至2020(推薦)
這篇文章主要介紹了PHPStorm2020.1永久激活及下載更新至2020,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09Linux下從零開始安裝配置Nginx服務(wù)器+PHP開發(fā)環(huán)境
這篇文章主要介紹了Linux下從零開始安裝配置Nginx服務(wù)器+PHP開發(fā)環(huán)境的教程,文中采用的是最主流的FastCGI連接方法,需要的朋友可以參考下2015-12-12