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

 更新时间:2023年10月10日 09:07:46   作者:begin  
这篇文章主要为大家介绍了掌握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框架容器管理依赖的资料请关注脚本之家其它相关文章!

相关文章

  • PHPStorm2020.1永久激活及下载更新至2020(推荐)

    PHPStorm2020.1永久激活及下载更新至2020(推荐)

    这篇文章主要介绍了PHPStorm2020.1永久激活及下载更新至2020,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • Laravel中的Auth模块详解

    Laravel中的Auth模块详解

    最近在工作中遇到了Auth模块,但是对Auth模块一知半解,通过查找相关的资料了解学习,所以下面这篇文章主要给大家介绍了关于Laravel中Auth模块的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-08-08
  • PHP中TP5 上传文件的实例详解

    PHP中TP5 上传文件的实例详解

    这篇文章主要介绍了PHP中TP5 上传文件的实例详解的相关资料,这里实现PHP 的上传文件的实例,需要的朋友可以参考下
    2017-07-07
  • 使用phpunit进行接口自动化测试

    使用phpunit进行接口自动化测试

    下面小编就为大家分享一篇使用phpunit进行接口自动化测试,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • PHP封装请求类实例分析【基于Yii框架】

    PHP封装请求类实例分析【基于Yii框架】

    这篇文章主要介绍了PHP封装请求类,结合实例形式分析了基于Yii框架的curl封装请求处理的相关实现技巧,需要的朋友可以参考下
    2019-10-10
  • thinkphp实现like模糊查询实例

    thinkphp实现like模糊查询实例

    这篇文章主要介绍了thinkphp实现like模糊查询,以实例形式讲述了字符串形式及数组形式作为查询条件的like模糊查询实现方法,是非常具有实用价值的技巧,需要的朋友可以参考下
    2014-10-10
  • Linux下从零开始安装配置Nginx服务器+PHP开发环境

    Linux下从零开始安装配置Nginx服务器+PHP开发环境

    这篇文章主要介绍了Linux下从零开始安装配置Nginx服务器+PHP开发环境的教程,文中采用的是最主流的FastCGI连接方法,需要的朋友可以参考下
    2015-12-12
  • 浅谈PHP中try{}catch{}的使用方法

    浅谈PHP中try{}catch{}的使用方法

    下面小编就为大家带来一篇浅谈PHP中try{}catch{}的使用方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • php中AES加密解密的例子小结

    php中AES加密解密的例子小结

    话不多说,先放上代码,一共有两个文件:AES.php(aes算法类文件)和aesDemo.php(应用实例文件)
    2014-02-02
  • 全面了解PHP中的全局变量

    全面了解PHP中的全局变量

    下面小编就为大家带来一篇全面了解PHP中的全局变量。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06

最新评论