当前位置: 代码网 > it编程>编程语言>Php > 掌握Laravel框架中容器的管理依赖实现松耦合

掌握Laravel框架中容器的管理依赖实现松耦合

2024年05月18日 Php 我要评论
1、什么是容器容器是一个用于管理类依赖和执行类依赖注入的工具,简而言之,容器就是我们在应用程序中定义、绑定和解析依赖项,以实现松耦合和可测试性。在laravel中应用本身就是一个容器,容器管理调用各种

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框架容器管理依赖的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com