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

