1、什么是容器
容器是一个用于管理类依赖和执行类依赖注入的工具,简而言之,容器就是我们在应用程序中定义、绑定和解析依赖项,以实现松耦合和可测试性。在laravel中应用本身就是一个容器,容器管理调用各种服务 laravel在运行的时候会创建一个app对象 这个对象就是容器 所有的服务都是在app中调用的。
几乎所有的服务容器绑定都会在服务提供者中注册,在服务提供者中可以通过blind方法去注册一个绑定,也可以通过单例singleton去注册绑定,还有instance等方法注册绑定。
2、依赖注入
在laravel框架中,开发者可以使用以下方式实现依赖注入:
1.在控制器的构造函数中声明依赖 注入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.使用闭包函数生成对象
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')); ????} }
上面的代码中,我们在构造函数中注入了一个container对象,然后通过make方法生成了一个userservice对象,并将userrepository对象作为参数传递给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中创建, // 而是通过ioc容器生成类b后通过参数的形式传入类a中; $ioc = new ioc(); $b = $ioc->make('b'); $a = new a($b); $a->getb();
4、反射
反射是程序实现依赖注入的基础,也是laravel服务容器实现服务解析的基础
反射函数参考:
reflectionclass 报告了一个类的有关信息 reflectionclass::getconstructor — 获取类的构造函数 reflectionclass::getconstructor::getparameters — 获取到constructor的属性值 reflectionclass::newinstanceargs — 从给出的参数创建一个新的类实例。 reflectionparameter::getclass — 获得类型提示类。 reflectionparameter::isdefaultvalueavailable — 检查是否有默认值。 reflectionparameter::getdefaultvalue — 获取到默认的属性值
如下几组方法,就是反射。
//获取类的反射信息,也就是类的所有信息 $reflector = new reflectionclass(类名); echo $reflector->getdoccomment(); 获取类的注释信息 //获取反射类的构造函数信息 $constructor = $reflector->getconstructor(); //获取反射类的构造函数的参数 $dependencies = $constructor->getparameters();
以上就是掌握laravel框架中容器管理依赖实现松耦合的详细内容,更多关于laravel框架容器管理依赖的资料请关注代码网其它相关文章!
发表评论